Principales respuestas
Convertir columnas a filas SQL 2000

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
- Editado Edgar_Chihuahua miércoles, 3 de agosto de 2016 20:24
Respuestas
-
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
-
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
Todas las respuestas
-
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
-
-
-
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
-