Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Multiple-Case-SQL-Abfrage ruft einzelne Zeile als mehrere Spalten ab

In Oracle 11.1 und höher können Sie UNPIVOT verwenden Operator. Wenn Sie über ein großes Datenvolumen verfügen, führt dies zu einer erheblichen Verbesserung der Ausführungszeit, da die Tabelle nur einmal gelesen werden muss, anstatt dreimal mit jeder Art von UNION ALL Ansatz.

Ich habe den Spaltennamen (in der Ausgabe) von date geändert zu dt da DATE ein reserviertes Wort in Oracle ist. type ist nicht viel besser (es ist ein Schlüsselwort, aber es ist nicht reserviert); am besten auch vermeiden. Ich habe Ihre Daten auch als Zeichenfolgen behandelt, als ich die Testdaten erstellt habe, aber es funktioniert genauso mit Daten.

Der with -Klausel ist nicht Teil der Lösung (kopieren Sie sie nicht blind und fügen Sie sie mit der Abfrage ein); Ich habe es nur zu Testzwecken hinzugefügt.

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