В Oracle 11.1 и по-нови можете да използвате UNPIVOT оператор. Ако имате голям обем данни, това ще осигури значително подобрение във времето за изпълнение, тъй като изисква четене на таблицата само веднъж, вместо три пъти с всякакъв вид UNION ALL подход.
Промених името на колоната (в изхода) от date към dt тъй като ДАТА е запазена дума в Oracle. type не е много по-добре (това е ключова дума, но не е запазена); най-добре е да го избягвате също. Също така третирах вашите дати като низове, когато създадох тестовите данни, но работи по същия начин с датите.
with клаузата не е част от решението (не я копирайте и поставяйте сляпо със заявката); Добавих го само за тестови цели.
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