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