Sql dinámico.

29/08/2006 - 20:27 por Pedroafa | Informe spam
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

#1 Maxi
29/08/2006 - 22:33 | Informe spam
Hola, cual seria el resultado que debia dar segun el cuadro que vos has
indicado? o ese cuadro es el resultado? de ser asi como esta armado el
detalle?


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Pedroafa" escribió en el mensaje
news:
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.




Preguntas similares