In Oracle 11.1 e versioni successive, puoi utilizzare UNPIVOT
operatore. Se disponi di un grande volume di dati, ciò fornirà un miglioramento significativo dei tempi di esecuzione, poiché richiede la lettura della tabella solo una volta, anziché tre volte con qualsiasi tipo di UNION ALL
approccio.
Ho cambiato il nome della colonna (nell'output) da date
a dt
poiché DATE è una parola riservata in Oracle. type
non è molto meglio (è una parola chiave ma non è riservata); meglio evitarlo anche tu. Ho anche trattato le tue date come stringhe quando ho creato i dati di test, ma funziona allo stesso modo con le date.
Il with
la clausola non fa parte della soluzione (non copiarla e incollarla alla cieca con la query); L'ho aggiunto solo a scopo di 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