SQL SELECT filas a columnas sin subconsulta
Pregunta
Tengo una tabla en Oracle 10g que contiene alguna información de la siguiente manera:
SQL> select * from t_test;
INFO CODIGO GRUPO
---------- ---------- ----------
101 190 VTOS
100 130 VTOS
102 140 VTOS
Me gustaría extraer todas las filas que tienen GRUPO = 'VTOS' y transponer las filas de columnas. Los valores en CODIGO están predeterminados (sé qué valores se pueden almacenar en esa columna), por lo que le gustaría obtener algo como esto:
INFO_190 INFO_130 INFO_140
-------- -------- --------
101 100 102
Sé que puedo hacerlo con algunas subconsultas, por ejemplo:
SELECT (SELECT info
FROM t_test
WHERE codigo = 190 AND grupo = 'VTOS') info_190,
(SELECT info
FROM t_test
WHERE codigo = 130 AND grupo = 'VTOS') info_130,
(SELECT info
FROM t_test
WHERE codigo = 140 AND grupo = 'VTOS') info_140
FROM DUAL
pero me gustaría encontrar una manera más eficiente. ¿Puede alguien sugerir cómo hacerlo?
Solución
Asumiendo que tiene un número relativamente pequeño de valores Codigo, algo como lo siguiente debería funcionar:
select max(decode(codigo, 190, info, '')) info_190,
max(decode(codigo, 130, info, '')) info_130,
max(decode(codigo, 140, info, '')) info_140
from t_test
where grupo = 'VTOS';
Si usted tiene múltiples valores de Grupo, grupo por grupo e incluirlo en su cláusula select.
Otros consejos
probar este ..
select case CODIGO when 190 then INFO end AS INFO_190,
case CODIGO when 130 then INFO end AS INFO_130,
case CODIGO when 140 then INFO end AS INFO_140
from t_test where grupo = 'VTOS'