sql >> Base de Datos >  >> RDS >> Oracle

consulta SQL de casos múltiples recuperar una sola fila como columna múltiple

En Oracle 11.1 y superior, puede usar UNPIVOT operador. Si tiene un gran volumen de datos, esto proporcionará una mejora significativa en el tiempo de ejecución, ya que requiere leer la tabla solo una vez, en lugar de tres veces con cualquier tipo de UNION ALL acercamiento.

Cambié el nombre de la columna (en la salida) de date a dt ya que DATE es una palabra reservada en Oracle. type no es mucho mejor (es una palabra clave pero no está reservada); mejor evitarlo también. También traté sus fechas como cadenas cuando creé los datos de prueba, pero funciona igual con las fechas.

El with la cláusula no es parte de la solución (no la copie y pegue ciegamente con la consulta); Lo agregué solo con fines de prueba.

with
     test_data ( ID, VT_Type1, Vt_type2, VT_Type3, Status_1, Status_2, Status_3, 
                                                         Date_1, Date_2, Date_3 ) as (
       select 1, -1, -1,  0, 'X', 'Y', 'Z', '04/12', '05/12', '06/12' from dual union all
       select 2, -1, -1, -1, 'A', 'B', 'C', '06/12', '07/12', '07/10' from dual
     )
select  id, type, status, dt
from    test_data
unpivot ( (vt_type, status, dt) for type in ( (vt_type1, status_1, date_1) as 1,
                                              (vt_type2, status_2, date_2) as 2,
                                              (vt_type3, status_3, date_3) as 3
                                            )
        )
where   vt_type != 0
;

ID  TYPE  STATUS  DT
--  ----  ------  -----
 1     1  X       04/12
 1     2  Y       05/12
 2     1  A       06/12
 2     2  B       07/12
 2     3  C       07/10