Oracle 11.1 以降では、UNPIVOT
を使用できます。 オペレーター。大量のデータがある場合、これにより実行時間が大幅に改善されます。UNION ALL
を使用してテーブルを 3 回読み取るのではなく、1 回だけ読み取る必要があるためです。
(出力の) 列名を date
から変更しました dt
へ DATE は 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
プレ>