В 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