Hola a todos.
Quiero hacer una consulta que me calcule la rentabilidad de cada año de un
fondo de inversión. Tengo una una tabla con los valores que ha ido tomando
ese fondo a lo largo de los años, tiene un campo fecha y otro valor. Como no
se me ocurria una consulta sql para resolver este problema lo hice a través
de crear la control dinámicamente en un procedimiento almacenado, lo que he
hecho, funcionar funciona. Lo que quiero saber, es si es el mejor medio para
resolverlo y si lo he hecho bien.
Este es el resultado:
Año Estado Rentabilidad
1999 verde 1.24
2000 verde 3.36
2001 verde 4.07
2002 rojo 2.90
2003 rojo 1.76
2004 rojo 1.40
2005 rojo 1.34
2006 rojo 1.09
ALTER PROCEDURE [dbo].[CalcularRentabilidadFondo]
@idfondo int
AS
BEGIN
DECLARE @year CHAR(4), @query VARCHAR(8000), @countQuery int
DECLARE @beforeRentabilidad DECIMAL(14,2),@rentabilidad DECIMAL(14,2)
DECLARE @color VARCHAR(5)
SET @query = ''
SET @countQuery = 0
SET @beforeRentabilidad = 0
DECLARE years_cursor CURSOR FOR SELECT year(fecha)
FROM Historicos
GROUP BY year(fecha),idfondo
HAVING idfondo = @idfondo ORDER BY year(fecha)
OPEN years_cursor
FETCH NEXT FROM years_cursor INTO @year
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @valorInicio DECIMAL(14,6), @valorFinal DECIMAL(14,6)
SELECT TOP 1 @valorInicio = valorliquidativo FROM Historicos
WHERE idfondo =
@idfondo AND year(fecha)=@year
ORDER BY fecha
SELECT TOP 1 @valorFinal = valorliquidativo FROM Historicos
WHERE idfondo =
@idfondo AND year(fecha)=@year
ORDER BY fecha DESC
/*Calcular la rentabilidad para el año*/
SELECT @rentabilidad = ((@valorFinal - @valorInicio) / @valorInicio)
* 100
/*Calcular el color*/
IF @beforeRentabilidad > @rentabilidad
SET @color = 'rojo'
ELSE IF @beforeRentabilidad < @rentabilidad
SET @color = 'verde'
ELSE
SET @color = 'azul'
IF @countQuery = 0
SET @query = @query + ' SELECT Ano=' +
RTRIM(LTRIM(CONVERT(VARCHAR,@year))) + ' ,Estado=''' + @color + '''
,Valor=' + RTRIM(LTRIM(CONVERT(VARCHAR,@rentabilidad)))
ELSE
SET @query = @query + ' UNION SELECT Ano=' +
RTRIM(LTRIM(CONVERT(VARCHAR,@year))) + ' ,Estado=''' + @color + '''
,Valor=' +
RTRIM(LTRIM(CONVERT(VARCHAR,@rentabilidad)))
SET @countQuery = @countQuery + 1
SET @beforeRentabilidad = @rentabilidad
FETCH NEXT FROM years_cursor INTO @year
END
EXEC (@query)
CLOSE years_cursor
DEALLOCATE years_cursor
END
Espero vuestras valoraciones, muchas gracias.
Un Saludo, Pedro.
Leer las respuestas