Dans Oracle 11.1 et supérieur, vous pouvez utiliser le UNPIVOT
opérateur. Si vous avez un grand volume de données, cela apportera une amélioration significative du temps d'exécution, car cela ne nécessite de lire la table qu'une seule fois, au lieu de trois fois avec n'importe quel type de UNION ALL
approche.
J'ai changé le nom de la colonne (dans la sortie) de date
à dt
puisque DATE est un mot réservé dans Oracle. type
n'est guère mieux (c'est un mot-clé mais il n'est pas réservé); mieux vaut l'éviter aussi. J'ai également traité vos dates comme des chaînes lorsque j'ai créé les données de test, mais cela fonctionne de la même manière avec les dates.
Le with
la clause ne fait pas partie de la solution (ne la copiez pas et ne la collez pas aveuglément avec la requête); Je l'ai ajouté uniquement à des fins de test.
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