Oracle
 sql >> Database >  >> RDS >> Oracle

query SQL con più casi recupera una riga singola come colonna multipla

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