none
Convertir columnas a filas SQL 2000 RRS feed

  • Pregunta

  • Buenas tardes:

    Necesito convertir las columnas de la siguiente consulta en filas:

    SELECT        anio, pesos_01 AS Enero, pesos_02 AS Febrero, pesos_03 AS Marzo, pesos_04 AS Abril, pesos_05 AS Mayo, pesos_06 AS Junio, pesos_07 AS Julio, pesos_08 AS Agosto, pesos_09 AS Septiembre, 
                             pesos_10 AS Octubre, pesos_11 AS Noviembre, pesos_12 AS Diciembre
    FROM            dbo.valsi_pes
    WHERE        (cli = '6000') AND (anio = '2015' OR
                             anio = '2016')

    Esto es lo que me arroja

    

    Y lo que quiero es una tabla de

    Mes Año 2015 Año 2016
    Enero 50 20
    Febrero 100 10
    Marzo 10 200

    Se que con PIVOT se puede pero no eh podido, por cierto estoy usando SQL server 2000

    Si me pueden ayudar se los agradezco 


    miércoles, 3 de agosto de 2016 20:18

Respuestas

  • Edgar_Chihuahua,

    Prueba lo siguiente:

    SELECT
    	t.Mes,
    	SUM(CASE WHEN T.Anio = '2015' THEN T.Monto END) [Año 2015],
    	SUM(CASE WHEN T.Anio = '2016' THEN T.Monto END) [Año 2016]
    FROM
    	(
    	SELECT anio [Anio], pesos_01 [Monto], 'ENERO' [Mes] 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_02, 'FEBRERO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_03, 'MARZO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_04, 'ABRIL' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_05, 'MAYO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_06, 'JUNIO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_07, 'JULIO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_08, 'AGOSTO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_09, 'SETIEMBRE' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_10, 'OCTUBRE' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_11, 'NOVIEMBRE' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_12, 'DICIEMBRE' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	) T
    GROUP BY
    	T.Mes


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Edgar_Chihuahua miércoles, 3 de agosto de 2016 21:17
    miércoles, 3 de agosto de 2016 21:03
  • Edgar_Chihuahua,

    Dado que en SQL Server 2000 no habían aparecido aún los operadores relacionales PIVOT y UNPIVOT debíamos encontrar la forma de transponer las columnas a filas, se me ocurrió lanzar consultas por cada columna y utilizar un operador de conjuntos para unir los resultados UNION [ALL]. De hecho, sí solo ejecutas la consulta que hay entre la cláusula FROM y GROUP BY te darás cuenta de que hablo (tabla derivada).

    FROM
    (
            <Consulta>
    )
    GROUP BY
    

    Finalmente lo que queda es agrupar por mes y -como diría el gran AMB- "regar los resultados" en la lista de selección por cada año. Está última operación -aún cuando tuviésemos versiones recientes- no necesitaba del operador PIVOT dado que el número de columnas es fijo, basta con una instrucción CASE.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Edgar_Chihuahua miércoles, 3 de agosto de 2016 22:22
    miércoles, 3 de agosto de 2016 22:04

Todas las respuestas

  • Edgar_Chihuahua,

    Prueba lo siguiente:

    SELECT
    	t.Mes,
    	SUM(CASE WHEN T.Anio = '2015' THEN T.Monto END) [Año 2015],
    	SUM(CASE WHEN T.Anio = '2016' THEN T.Monto END) [Año 2016]
    FROM
    	(
    	SELECT anio [Anio], pesos_01 [Monto], 'ENERO' [Mes] 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_02, 'FEBRERO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_03, 'MARZO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_04, 'ABRIL' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_05, 'MAYO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_06, 'JUNIO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_07, 'JULIO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_08, 'AGOSTO' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_09, 'SETIEMBRE' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_10, 'OCTUBRE' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_11, 'NOVIEMBRE' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	UNION ALL
    	SELECT anio, pesos_12, 'DICIEMBRE' 
    		FROM dbo.valsi_pes WHERE (cli = '6000') AND (anio IN ('2015', '2016'))
    	) T
    GROUP BY
    	T.Mes


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Edgar_Chihuahua miércoles, 3 de agosto de 2016 21:17
    miércoles, 3 de agosto de 2016 21:03
  • Muchas gracias, es lo que buscaba
    miércoles, 3 de agosto de 2016 21:17
  • Me podrías explicar la consulta es que no la comprendo muy bien
    miércoles, 3 de agosto de 2016 21:19
  • Edgar_Chihuahua,

    Dado que en SQL Server 2000 no habían aparecido aún los operadores relacionales PIVOT y UNPIVOT debíamos encontrar la forma de transponer las columnas a filas, se me ocurrió lanzar consultas por cada columna y utilizar un operador de conjuntos para unir los resultados UNION [ALL]. De hecho, sí solo ejecutas la consulta que hay entre la cláusula FROM y GROUP BY te darás cuenta de que hablo (tabla derivada).

    FROM
    (
            <Consulta>
    )
    GROUP BY
    

    Finalmente lo que queda es agrupar por mes y -como diría el gran AMB- "regar los resultados" en la lista de selección por cada año. Está última operación -aún cuando tuviésemos versiones recientes- no necesitaba del operador PIVOT dado que el número de columnas es fijo, basta con una instrucción CASE.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Edgar_Chihuahua miércoles, 3 de agosto de 2016 22:22
    miércoles, 3 de agosto de 2016 22:04
  • Ok muchas gracias es de mucha ayuda
    miércoles, 3 de agosto de 2016 22:23