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.

Preguntas similare

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.




Respuesta Responder a este mensaje
#2 Pedroafa
30/08/2006 - 00:15 | Informe spam
Ese cuadro es lo que busco y el resultado que da mi procedimiento. Lo que me
gustaría saber es vuestra opinión, si esta bien hecho así o por lo tanto
puede mejorarse.

Muchas gracias.

Un Saludo, Pedro

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








Respuesta Responder a este mensaje
#3 Maxi
30/08/2006 - 02:59 | Informe spam
Hola, no puedo saber si esta bien hecho sin tener de donde y como sale
esto., Ya el hecho que uses cursores y sql dinamico es muy malo :(


Salu2
-
[Microsoft MVP] SQL Server
Orador para Culminis Latam
INETA Speaker
www.sqlgurus.org

MSN:

"Pedroafa" escribió en el mensaje
news:
Ese cuadro es lo que busco y el resultado que da mi procedimiento. Lo que
me gustaría saber es vuestra opinión, si esta bien hecho así o por lo
tanto puede mejorarse.

Muchas gracias.

Un Saludo, Pedro

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












Respuesta Responder a este mensaje
#4 Miguel Egea
30/08/2006 - 03:22 | Informe spam
se puede hacer sin cursores
Select Year(fecha) año,

Estado,

(Select top 1 ValorLiquidativo from Historico where
year(fecha)=year(h.fecha) order by fecha) inicio,

(Select top 1 ValorLiquidativo from Historico where
year(fecha)=year(h.fecha) order by fecha desc) Fin ,

(-(Select top 1 ValorLiquidativo from Historico where
year(fecha)=year(h.fecha) order by fecha) +

(Select top 1 ValorLiquidativo from Historico where
year(fecha)=year(h.fecha) order by fecha desc))/(Select top 1
ValorLiquidativo from Historico where year(fecha)=year(h.fecha) order by
fecha) Rentabilidad

from Historico h

group by Year(fecha) ,

Estado



ya nos cuentas..

"Pedroafa" wrote in message
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.




Respuesta Responder a este mensaje
#5 Pedroafa
30/08/2006 - 12:59 | Informe spam
Hola, ya me imagina que podía hacerse mucho mejor con usa sola sql, pero no
se me ocurría como. Al final me ha qudado así la cosa. Como se puede ver en
la consulta tengo que calcular la rentabilidad varias veces, habría alguna
forma de simplificarlo????.

SELECT YEAR(fecha) AS Año,

CASE

WHEN CAST((((SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)-1 AND idfondo = @idfondo ORDER BY fecha DESC) -
(SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)-1 AND idfondo = @idfondo ORDER BY fecha)) /
(SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)-1 AND idfondo = @idfondo ORDER BY fecha)) * 100 AS
DECIMAL(14,2)) > CAST((((SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)AND idfondo = @idfondo ORDER BY fecha DESC) -
(SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)AND idfondo = @idfondo ORDER BY fecha)) / (SELECT
TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)AND idfondo = @idfondo ORDER BY fecha)) * 100 AS
DECIMAL(14,2)) THEN 'rojo'

WHEN CAST((((SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)-1 AND idfondo = @idfondo ORDER BY fecha DESC) -
(SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)-1 AND idfondo = @idfondo ORDER BY fecha)) /
(SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)-1 AND idfondo = @idfondo ORDER BY fecha)) * 100 AS
DECIMAL(14,2)) < CAST((((SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)AND idfondo = @idfondo ORDER BY fecha DESC) -
(SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)AND idfondo = @idfondo ORDER BY fecha)) / (SELECT
TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)AND idfondo = @idfondo ORDER BY fecha)) * 100 AS
DECIMAL(14,2)) THEN 'verde'

ELSE 'azul'

END AS Estado,

CAST((((SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)AND idfondo = @idfondo ORDER BY fecha DESC) -
(SELECT TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)AND idfondo = @idfondo ORDER BY fecha)) / (SELECT
TOP 1 ValorLiquidativo FROM Historicos WHERE

YEAR(fecha)=YEAR(h.fecha)AND idfondo = @idfondo ORDER BY fecha)) * 100 AS
DECIMAL(14,2)) AS Rentabilidad

FROM Historicos h

GROUP BY YEAR(fecha),idfondo HAVING idfondo = 13 ORDER BY YEAR(fecha)


Un saludo y muchas gracias, Pedro.
http://pedroafa.blogspot.com/

"Miguel Egea" escribió en el mensaje
news:
se puede hacer sin cursores
Select Year(fecha) año,

Estado,

(Select top 1 ValorLiquidativo from Historico where
year(fecha)=year(h.fecha) order by fecha) inicio,

(Select top 1 ValorLiquidativo from Historico where
year(fecha)=year(h.fecha) order by fecha desc) Fin ,

(-(Select top 1 ValorLiquidativo from Historico where
year(fecha)=year(h.fecha) order by fecha) +

(Select top 1 ValorLiquidativo from Historico where
year(fecha)=year(h.fecha) order by fecha desc))/(Select top 1
ValorLiquidativo from Historico where year(fecha)=year(h.fecha) order by
fecha) Rentabilidad

from Historico h

group by Year(fecha) ,

Estado



ya nos cuentas..

"Pedroafa" wrote in message
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.








Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida