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

Oracle Dynamic Pivoting

Menggunakan sql dinamis untuk hasil di mana kolom tidak diketahui pada saat dieksekusi sedikit merepotkan di Oracle dibandingkan dengan RDMBS tertentu lainnya.

Karena tipe record untuk output belum diketahui, maka tidak dapat ditentukan sebelumnya.

Di Oracle 11g, salah satu caranya adalah dengan menggunakan prosedur tanpa nama yang menghasilkan tabel sementara dengan hasil yang diputar.

Kemudian pilih hasil dari tabel sementara itu.

declare
  v_sqlqry clob;
  v_cols clob;
begin
  -- Generating a string with a list of the unique names
  select listagg(''''||CCL||''' as "'||CCL||'"', ', ') within group (order by CCL)
  into v_cols
  from 
  (
    select distinct CCL
    from tableA
  );

  -- drop the temporary table if it exists
  EXECUTE IMMEDIATE 'DROP TABLE tmpPivotTableA';
  EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF;

  -- A dynamic SQL to create a temporary table 
  -- based on the results of the pivot
  v_sqlqry := '
    CREATE GLOBAL TEMPORARY TABLE tmpPivotTableA
    ON COMMIT PRESERVE ROWS AS
    SELECT * 
    FROM (SELECT ID, CCL, Flag FROM TableA) src 
    PIVOT (MAX(Flag) FOR (CCL) IN ('||v_cols||')) pvt';

  -- dbms_output.Put_line(v_sqlqry); -- just to check how the sql looks like
  execute immediate v_sqlqry;

end;
/

select * from tmpPivotTableA;

Pengembalian:

ID  adam john rob terry
--  ---- ---- --- -----
1   x    x    x
2        x      

Anda dapat menemukan tes di db<>biola di sini

Di Oracle 11g, trik keren lainnya (dibuat oleh Anton Scheffer) untuk digunakan dapat ditemukan di blog ini. Tetapi Anda harus menambahkan fungsi pivot untuk itu.
Kode sumber dapat ditemukan di zip ini

Setelah itu SQL bisa sesederhana ini:

select * from 
table(pivot('SELECT ID, CCL, Flag FROM TableA'));

Anda akan menemukan tes di db<>biola di sini



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pola nama tidak valid saat mencoba melewati pemetaan objek tipe Oracle khusus

  2. Equals(=) vs. LIKE untuk tipe data tanggal

  3. Oracle Date TO_CHAR('Bulan DD, YYYY') memiliki spasi ekstra di dalamnya

  4. Temukan Semua Nilai Non-Numerik dalam Kolom di Oracle

  5. Bagaimana Cara Membuat Kunci Asing di Oracle SQL Developer?