SQL - TRANSFORMAR COLUMNAS EN FILAS

   
Vista:

TRANSFORMAR COLUMNAS EN FILAS

Publicado por robertux (20 intervenciones) el 14/08/2008 02:09:31
SAludos
Alguien sabe cómo transformar las columnas obtenidoas con SELECT en filas, es decir, en una tabla tengo lo siguiente:

idPregunta-------Pregunta---------idRespuesta------Respuesta
--------1------------Pregunta uno-----------1--------------Respuesta uno
--------1------------Pregunta uno-----------2--------------Respuesta dos
--------2------------Pregunta dos-----------1--------------Respuesta uno
--------2------------Pregunta dos-----------2--------------Respuesta dos
--------3------------Pregunta tres-----------1--------------Respuesta uno
--------3------------Pregunta tres-----------2--------------Respuesta dos

y quiero obtener lo sgte:

idPregunta---Pregunta--------idRespuesta1---Respuesta1-------idRespuesta2---Respusta2
--------1--------Pregunta uno-----------1------------Respuesta uno-----------2-------------Respuesta dos
--------2--------Pregunta dos-----------1------------Respuesta uno-----------2-------------Respuesta dos
--------3--------Pregunta tres-----------1------------Respuesta uno-----------2-------------Respuesta dos

agradezco la ayuda
Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:TRANSFORMAR COLUMNAS EN FILAS

Publicado por Isaias (5073 intervenciones) el 14/08/2008 18:47:58
¿Que motor de base de datos?

Si es SQL Server, en 2000, tendrias que "jugar" con el CASE en 2005, cuentas con PIVOT, te pongo un ejemplo (2000):
Year Quarter Amount
-------------------------------

1995 1 125,000.90
1995 2 136,000.75
1995 3 212,000.34
1995 4 328,000.82
1996 3 728,000.35
1996 2 422,000.13
1996 1 328,000.82

YEAR Q1 Q2 Q3 Q4
-------------------------------------------------------------------

1995 125,000.90 136,000.75 212,000.34 328,000.82
1996 328,000.82 422,000.13 728,000.35 0.00

SELECT YEAR,
Q1= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 1 AND YEAR =
Q.YEAR),0),
Q2= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 2 AND YEAR =
Q.YEAR),0),
Q3= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 3 AND YEAR =
Q.YEAR),0),
Q4= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 4 AND YEAR =
Q.YEAR),0)
FROM QTRSALES Q
GROUP BY YEAR
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:TRANSFORMAR COLUMNAS EN FILAS

Publicado por robertux (20 intervenciones) el 14/08/2008 19:04:27
Muchisimas gracias Isaias. Lo he intentado como me sugieres pero lo que pasa que como podrás darte cuenta necesito dos columnas que se conviertan en filas y siguiendo lo que tu dices tengo que hacer tantos SELECT's como columnas necesite y eso me puede afectar el rendimiento.
Utilizo SQL Server 2000

como lo puedo conseguir si tengo algo como

Year Quarter Amount OtraCosa
--------------------------------------------
1995 1 125,000.90 a
1995 2 136,000.75 b
1995 3 212,000.34 c
1995 4 328,000.82 d
1996 3 728,000.35 c
1996 2 422,000.13 b
1996 1 328,000.82 a

y necesito algo como

YEAR CosaA Q1 CosaB Q2 CosaC Q3 CosaD Q4
-------------------------------------------------------------------

1995 a 125,000.90 b 136,000.75 c 212,000.34 d 328,000.82
1996 a 328,000.82 b 422,000.13 c 728,000.35 d 0.00

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:TRANSFORMAR COLUMNAS EN FILAS

Publicado por Isaias (5073 intervenciones) el 15/08/2008 18:27:51
Sin duda que afectara el rendimiento, pero no hay otra forma de solucionarlo, en 2005, existe el PIVOT, pero en 2000, no hay tal.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:TRANSFORMAR COLUMNAS EN FILAS

Publicado por robertux (4 intervenciones) el 15/08/2008 20:47:22
Gracias por la ayuda.

otra forma que he intentado sin conseguir lo que necesito es algo como:

SELECT YEAR,
Q1= (CASE WHEN QUARTER = 1 THEN AMOUNT ELSE 0 END),
Q2= (CASE WHEN QUARTER = 2 THEN AMOUNT ELSE 0 END),
Q3= (CASE WHEN QUARTER = 3 THEN AMOUNT ELSE 0 END),
Q4= (CASE WHEN QUARTER = 4 THEN AMOUNT ELSE 0 END)
FROM QTRSALES Q
GROUP BY YEAR

pero me sale de forma escalonada, es decir algo como

YEAR Q1 Q2 Q3 Q4
------------------------------------------------------------------------------
1995 125,000.90 0 0 0
1995 0 136,000.75 0 0
1995 0 0 212,000.34 0
1995 0 0 0 328,000.82
1996 0 0 728,000.35 0
1996 0 422,000.13 0 0
1996 328,000.82 0 0 0

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:TRANSFORMAR COLUMNAS EN FILAS

Publicado por Isaias (5073 intervenciones) el 15/08/2008 20:58:20
Te falto el SUM

SELECT YEAR,
Q1= SUM(CASE WHEN QUARTER = 1 THEN AMOUNT ELSE 0 END),
Q2= SUM(CASE WHEN QUARTER = 2 THEN AMOUNT ELSE 0 END),
Q3= SUM(CASE WHEN QUARTER = 3 THEN AMOUNT ELSE 0 END),
Q4= SUM(CASE WHEN QUARTER = 4 THEN AMOUNT ELSE 0 END)
FROM QTRSALES Q
GROUP BY YEAR
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:TRANSFORMAR COLUMNAS EN FILAS

Publicado por robertux (4 intervenciones) el 16/08/2008 00:59:41
agadezco.
pero para mi caso "amount" es un tipo string y no puedo utilixar "sum"
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:TRANSFORMAR COLUMNAS EN FILAS

Publicado por Isaias (5073 intervenciones) el 16/08/2008 03:21:35
Claro que puedes, utiliza CAST / CONVERT, bajo la advertencia que si amount trae LETRAS o CARACTERES, no servira.

Q1 = SUM(CASE WHEN CAMPO = 1 THEN CAST(AMOUNT AS MONEY) END)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar