No Oracle 11.1 e superior, você pode usar o
UNPIVOT
operador. Se você tiver um grande volume de dados, isso proporcionará uma melhora significativa no tempo de execução, pois exige a leitura da tabela apenas uma vez, em vez de três vezes com qualquer tipo de UNION ALL
abordagem. Alterei o nome da coluna (na saída) de
date
para dt
já que DATE é uma palavra reservada no Oracle. type
não é muito melhor (é uma palavra-chave, mas não é reservada); melhor evitar também. Também tratei suas datas como strings quando criei os dados de teste, mas funciona da mesma forma com datas. O
with
cláusula não faz parte da solução (não copie e cole cegamente com a consulta); Eu adicionei apenas para fins de teste. 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