Oracle
 sql >> Base de données >  >> RDS >> Oracle

requête SQL à plusieurs cas récupérer une seule ligne en tant que colonne multiple

Dans Oracle 11.1 et supérieur, vous pouvez utiliser le UNPIVOT opérateur. Si vous avez un grand volume de données, cela apportera une amélioration significative du temps d'exécution, car cela ne nécessite de lire la table qu'une seule fois, au lieu de trois fois avec n'importe quel type de UNION ALL approche.

J'ai changé le nom de la colonne (dans la sortie) de date à dt puisque DATE est un mot réservé dans Oracle. type n'est guère mieux (c'est un mot-clé mais il n'est pas réservé); mieux vaut l'éviter aussi. J'ai également traité vos dates comme des chaînes lorsque j'ai créé les données de test, mais cela fonctionne de la même manière avec les dates.

Le with la clause ne fait pas partie de la solution (ne la copiez pas et ne la collez pas aveuglément avec la requête); Je l'ai ajouté uniquement à des fins de 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