SQL - Hacer una tabla cruzada

   
Vista:

Hacer una tabla cruzada

Publicado por DAVID (2 intervenciones) el 04/05/2012 13:36:37
Duda de tabla cruzada
Necesitamos crear un COUNT(*) en forma de tabla en lugar de en forma de columna. ¿Nos podéis ayudar? Gracias por adelantado.

Tenemos la TABLA1 como sigue:
NUM SEG1 SEG2
1 1 1
2 1 1
3 2 2
4 2 2
5 2 3
6 3 3

Queremos una query que nos de la TABLA3 como sigue:

0
1 2 0 0 2
2 0 2 1 3
3 0 0 1 1
SUM1 2 2 2 6



SEG1
1 2 3 SUM2
SEG2 1 2 0 0 2
2 0 2 1 3
3 0 0 1 1
SUM1 2 2 2 6


Lo que hacemos es lo siguiente:
Primero ejecutamos la query:
SELECT SEG1, SEG2, COUNT(*) AS CUENTA
FROM TABLA1
GROUP BY SEG1, SEG2
ORDER BY SEG1, SEG2

para obtener la TABLA2:
SEG1 SEG2 CUENTA
1 1 2
2 2 2
2 3 1
3 3 1

Con ese resultado seguimos a mano para obtener la TABLA3.
SEG1
1 2 3 SUM2
SEG2 1 2 0 0 2
2 0 2 1 3
3 0 0 1 1
SUM1 2 2 2 6

¿Hay alguna forma de automatizarlo con SQL sin hacer este segundo paso a mano?

Gracias y 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

Hacer una tabla cruzada

Publicado por leonardo_josue (878 intervenciones) el 04/05/2012 19:31:27
Hola David:

No mencionas en tu post con qué motor de BD estás trabajando, por lo que resulta muy difícil darte una respuesta puntual a tu problema. La sintaxis entre cada motor puede ser muy diferente, por lo que es importante que siempre especifiques este detalle cuando publiques algo en el foro.

Si estoy entendiendo correctamente qué es lo que quieres hacer, podrías hacerlo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
mysql> SELECT * FROM tabla;
+------+------+------+
| NUM  | SEG1 | SEG2 |
+------+------+------+
|    1 |    1 |    1 |
|    2 |    1 |    1 |
|    3 |    2 |    2 |
|    4 |    2 |    2 |
|    5 |    2 |    3 |
|    6 |    3 |    3 |
+------+------+------+
6 rows in set (0.00 sec)
 
mysql> SELECT
    -> seg1,
    -> SUM(CASE WHEN seg2 = 1 THEN 1 ELSE 0 END) uno,
    -> SUM(CASE WHEN seg2 = 2 THEN 1 ELSE 0 END) dos,
    -> SUM(CASE WHEN seg2 = 3 THEN 1 ELSE 0 END) tres,
    -> COUNT(*)
    -> FROM tabla GROUP BY seg1
    -> WITH ROLLUP;
+------+------+------+------+----------+
| seg1 | uno  | dos  | tres | COUNT(*) |
+------+------+------+------+----------+
|    1 |    2 |    0 |    0 |        2 |
|    2 |    0 |    2 |    1 |        3 |
|    3 |    0 |    0 |    1 |        1 |
| NULL |    2 |    2 |    2 |        6 |
+------+------+------+------+----------+
4 rows in set (0.00 sec)


El modificador WITH ROLLUP sirve para obtener la sumarización de las columnas, pero no es soportada por todos las BD (es por eso que hago la primer observación). Otra manera sería hacer dos consultas por separado y hacer un UNION.

Si quitas el WITH ROLLUP la consulta debería funcionar en la mayoría de las BD actuales.

Dale un vistazo y nos comentas.

Saludos
Leo.
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

Gracias

Publicado por David (2 intervenciones) el 08/05/2012 10:04:48
Hola Leo:

Gracias por tu respuesta. Efectivamente funciona como tú nos dicho.

Gracias de nuevo.

David
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