Cursores en Store Procedure.... u otra alternativa

18/04/2005 - 23:37 por alfbl_85 | Informe spam
Tengo 2 tablas en mi Bd:

Mes(Mes PK,Descripcion) y Valores(Anio PK,Mes PK,Valor)

y quiero generar un reporte anual de estos valores, la única forma que
he encontrado es utilizando cursores (por mi inexperiencia), aunque
tambien utilizo una tabla temporal.

Lo que quisiera saber es si hay alguna forma de lograr este resultado
sin tener que recurrir a usar cursores, la verdad yo ya agote todos
mis escasos conocimientos y no lo he logrado.

Gracias de antemano, espero su crítica y aportes.


ESTE ES EL RESULTADO

Anio Enero Febrero Marzo Abril Mayo
2001 -- 77 78 80 82 84
2002 -- 71 71 71 71
71 2003 -- 77 78 80
82 84 2004 78 82 87 92
97 2

LLAMANDO AL PROCEDURE:

EXEC sp_ResumenAnio null, '2001','2004'




CODIGO COMPLETO

/*************************************************************/
CREATE PROCEDURE sp_ResumenAnio
@Anio int=NULL,
@AnioDesde int=NULL,
@AnioHasta int=NULL
AS
BEGIN

SET NOCOUNT ON
DECLARE @Nombre VARCHAR(50)
DECLARE @Valor INT
DECLARE @Val CHAR(2)
DECLARE @Mes INT
DECLARE @Count INT
DECLARE @GrantCount INT
DECLARE @Select VARCHAR(8000)
DECLARE @GrantSelect VARCHAR(8000)

SET @GrantCount = 0
SET @GrantSelect = ''

DECLARE CurValores CURSOR SCROLL
FOR ( SELECT Anio
FROM Valores
WHERE CASE WHEN NOT @Anio IS NULL THEN Anio ELSE 0 END = CASE WHEN
NOT @Anio IS NULL THEN @Anio ELSE 0 END
AND CASE WHEN NOT @AnioDesde IS NULL THEN Anio ELSE 0 END >ÊSE
WHEN NOT @AnioDesde IS NULL THEN @AnioDesde ELSE 0 END
AND CASE WHEN NOT @AnioHasta IS NULL THEN Anio ELSE 0 END <ÊSE
WHEN NOT @AnioHasta IS NULL THEN @AnioHasta ELSE 0 END
GROUP BY Anio)
OPEN CurValores
FETCH FIRST FROM CurValores INTO @Anio
CREATE TABLE #Tempo (Anio INT,Enero CHAR(10),Febrero CHAR(10), Marzo
CHAR(10),Abril CHAR(10),Mayo CHAR(10),
Junio CHAR(10),Julio CHAR(10),Agosto CHAR(10),Setiembre
CHAR(10),Octubre CHAR(10),Noviembre CHAR(10),
Diciembre CHAR(10) )
WHILE @@FETCH_STATUS=0
BEGIN
DECLARE CurMeses CURSOR SCROLL
FOR (SELECT a.Descripcion, v.Valor, v.Anio,v.Mes
FROM Mes a RIGHT JOIN Valores v ON a.Mes=v.Mes
WHERE v.Anio=@Anio)
SET @Select=''
SET @Count=0



INSERT INTO #Tempo (Anio) VALUES (@Anio)

OPEN CurMeses
FETCH FIRST FROM CurMeses INTO @Nombre,@Valor,@Anio,@Mes
WHILE @@FETCH_STATUS=0
BEGIN
IF @Valor IS NULL SET @Val='--'
ELSE SET @ValÊST(@Valor AS CHAR(2))

IF @Mes= 1 UPDATE #Tempo SET EneroÊST(@Val AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 2 UPDATE #Tempo SET FebreroÊST(@Val AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 3 UPDATE #Tempo SET MarzoÊST(@VaL AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 4 UPDATE #Tempo SET AbrilÊST(@Val AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 5 UPDATE #Tempo SET MayoÊST(@Val AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 6 UPDATE #Tempo SET JunioÊST(@Val AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 7 UPDATE #Tempo SET JulioÊST(@Val AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 8 UPDATE #Tempo SET AgostoÊST(@Val AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 9 UPDATE #Tempo SET SetiembreÊST(@Val AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 10 UPDATE #Tempo SET OctubreÊST(@Val AS CHAR(4)) WHERE
Anio=@Anio
IF @Mes= 11 UPDATE #Tempo SET NoviembreÊST(@Val AS CHAR(4))
WHERE Anio=@Anio
IF @Mes= 12 UPDATE #Tempo SET DiciembreÊST(@Val AS CHAR(4))
WHERE Anio=@Anio

FETCH NEXT FROM CurMeses INTO @Nombre, @Valor, @Anio,@Mes
END
CLOSE CurMeses
DEALLOCATE CurMeses

FETCH NEXT FROM CurValores INTO @Anio
END

SELECT * FROM #Tempo
DROP TABLE #Tempo
CLOSE CurValores
DEALLOCATE CurValores
END
GO
/*********************************************************************/
 

Leer las respuestas

#1 Isaias
19/04/2005 - 00:46 | Informe spam
Creo que en tu tabla MES, hace falta alguna otra columna, a menos que los
MESES sean unicos y no se repitan los valores, esto es, mas de una vez el
mismo mes.

¿Es asi?

Preguntas similares