Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

kueri SQL beberapa kasus mengambil satu baris sebagai beberapa kolom

Di Oracle 11.1 dan di atasnya, Anda dapat menggunakan UNPIVOT operator. Jika Anda memiliki volume data yang besar, ini akan memberikan peningkatan yang signifikan dalam waktu eksekusi, karena hanya perlu membaca tabel satu kali, bukan tiga kali dengan jenis UNION ALL apa pun. pendekatan.

Saya mengubah nama kolom (di output) dari date ke dt karena DATE adalah kata yang dicadangkan di Oracle. type tidak jauh lebih baik (ini adalah kata kunci tetapi tidak dicadangkan); sebaiknya hindari juga. Saya juga memperlakukan tanggal Anda sebagai string ketika saya membuat data pengujian, tetapi cara kerjanya sama dengan tanggal.

with klausa bukan bagian dari solusi (jangan salin dan tempel secara membabi buta dengan kueri); Saya menambahkannya hanya untuk tujuan pengujian.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. transpos kolom ke baris oracle

  2. Mendeklarasikan Variabel Sementara di Oracle Database

  3. JDBC Batch menyisipkan penanganan pengecualian

  4. TO_DATE() Fungsi di Oracle

  5. Memanggil kode paket PL/SQL dalam Program Java