locked
Sumar columnas dinamicamente RRS feed

  • Pregunta

  • Buenos días, tengo la siguiente pregunta:

    Tengo una tabla que contiene 12 campos y cada campo representa el mes

    ejemplo Select [v-1], [v-2]  from TblMovimientos  debo de sumar las columnas de acuerdo al rango de meses que me especifique el usuario; ejemplo: si me escribe el mes 5 debo sumar las columas [v-1], [v-2] ... [v-5] hata llegar al mes 5 [v-5]

     

    Gracias!


    Desarrollo
    martes, 20 de abril de 2010 15:57

Respuestas

  • Una sugerencia: usar la cláusula UNPIVOT para hacer un SELECT que devuelva las 12 columnas como filas. A esa SELECT meterle un WHERE que filtre los meses deseados, y luego sumarlos con un SUM y un GROUP BY.

    CREATE TABLE DatosMeses
    (
    ID INT IDENTITY PRIMARY KEY,
    [Mes01] INT,
    [Mes02] INT,
    [Mes03] INT,
    [Mes04] INT,
    [Mes05] INT,
    [Mes06] INT,
    [Mes07] INT,
    [Mes08] INT,
    [Mes09] INT,
    [Mes10] INT,
    [Mes11] INT,
    [Mes12] INT
    )
    GO
    INSERT DatosMeses([Mes01],[Mes02],[Mes03],[Mes04],[Mes05],[Mes06],[Mes07],[Mes08],[Mes09],[Mes10],[Mes11],[Mes12]) Values(1,2,3,4,5,6,7,8,9,10,11,12)
    INSERT DatosMeses([Mes01],[Mes02],[Mes03],[Mes04],[Mes05],[Mes06],[Mes07],[Mes08],[Mes09],[Mes10],[Mes11],[Mes12]) Values(1,1,1,1,1,1,1,1,1,1,1,1)
    INSERT DatosMeses([Mes01],[Mes02],[Mes03],[Mes04],[Mes05],[Mes06],[Mes07],[Mes08],[Mes09],[Mes10],[Mes11],[Mes12]) Values(1,2,1,2,1,2,1,2,1,2,1,2)
    GO
    SELECT Id, Sum(Valor)
    FROM DatosMeses 
    UNPIVOT (Valor FOR Mes IN ([Mes01],[Mes02],[Mes03],[Mes04],[Mes05],[Mes06],[Mes07],[Mes08],[Mes09],[Mes10],[Mes11],[Mes12])) UnPVT
    WHERE Mes<'Mes05'
    GROUP BY Id
    GO

     

     

     

    martes, 20 de abril de 2010 19:55

Todas las respuestas

  • Si lo haces dentro de un procedimiento almacenado yo optaría por implementar los 12 IF (aunque te parezca feo) que hagan las sumas correspondientes que no hacerlo a través de query dinámico, y si lo haces a través de código, pues lo mismo pero desde la aplicación cliente.

    martes, 20 de abril de 2010 16:02
  • Una sugerencia: usar la cláusula UNPIVOT para hacer un SELECT que devuelva las 12 columnas como filas. A esa SELECT meterle un WHERE que filtre los meses deseados, y luego sumarlos con un SUM y un GROUP BY.

    CREATE TABLE DatosMeses
    (
    ID INT IDENTITY PRIMARY KEY,
    [Mes01] INT,
    [Mes02] INT,
    [Mes03] INT,
    [Mes04] INT,
    [Mes05] INT,
    [Mes06] INT,
    [Mes07] INT,
    [Mes08] INT,
    [Mes09] INT,
    [Mes10] INT,
    [Mes11] INT,
    [Mes12] INT
    )
    GO
    INSERT DatosMeses([Mes01],[Mes02],[Mes03],[Mes04],[Mes05],[Mes06],[Mes07],[Mes08],[Mes09],[Mes10],[Mes11],[Mes12]) Values(1,2,3,4,5,6,7,8,9,10,11,12)
    INSERT DatosMeses([Mes01],[Mes02],[Mes03],[Mes04],[Mes05],[Mes06],[Mes07],[Mes08],[Mes09],[Mes10],[Mes11],[Mes12]) Values(1,1,1,1,1,1,1,1,1,1,1,1)
    INSERT DatosMeses([Mes01],[Mes02],[Mes03],[Mes04],[Mes05],[Mes06],[Mes07],[Mes08],[Mes09],[Mes10],[Mes11],[Mes12]) Values(1,2,1,2,1,2,1,2,1,2,1,2)
    GO
    SELECT Id, Sum(Valor)
    FROM DatosMeses 
    UNPIVOT (Valor FOR Mes IN ([Mes01],[Mes02],[Mes03],[Mes04],[Mes05],[Mes06],[Mes07],[Mes08],[Mes09],[Mes10],[Mes11],[Mes12])) UnPVT
    WHERE Mes<'Mes05'
    GROUP BY Id
    GO

     

     

     

    martes, 20 de abril de 2010 19:55
  • Bunenos dias amigo, mil gracias por tú excelente ayuda.

    Pero al momento de ejecutar la instrucción me esta generado este error:

    Incorrect syntax near the keyword 'FOR'


    Desarrollo
    miércoles, 21 de abril de 2010 13:29
  • Hola, ya supe porque el error: mi DB no hera compatibiliadad 90
    Desarrollo
    miércoles, 21 de abril de 2010 13:41