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

Pivot dengan Kolom Dinamis di Oracle

SYS_REFCURSOR dalam fungsi tersimpan (mis. PL/SQL digunakan alih-alih menggunakan SQL secara langsung ) dapat digunakan untuk mendapatkan kumpulan hasil yang dihasilkan secara dinamis (mis. Pivot Dinamis ). Dalam hal ini, string untuk Agregasi Bersyarat dihasilkan :

CREATE OR REPLACE FUNCTION get_passengers_rs RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767);
  v_str       VARCHAR2(32767);
BEGIN
  SELECT LISTAGG('MAX(CASE WHEN rn = '||lvl||' THEN age||''(''||passengers||'')'' END) 
                   AS "Age'||lvl||'"' ,',') WITHIN GROUP (ORDER BY 0)
    INTO v_str
    FROM ( SELECT level AS lvl  
             FROM dual
          CONNECT BY level <= (SELECT MAX(COUNT(*)) FROM t GROUP BY ID ) ) t;  

  v_sql :=
  'SELECT ID, '|| v_str ||'
     FROM 
     (
      SELECT t.*, 
             ROW_NUMBER() OVER (PARTITION BY ID ORDER BY 0) AS rn
        FROM t     
      )
    GROUP BY ID';

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;

Saya juga menambahkan nama penumpang untuk membedakan setiap data dengan baik.

Kemudian jalankan kode di bawah ini :

VAR rc REFCURSOR
EXEC :rc := get_passengers_rs;
PRINT rc

dari Baris Perintah Pengembang SQL untuk melihat hasil yang diharapkan.

Kode di atas menghasilkan string SQL ini (v_sql ) untuk data yang ada saat ini

SELECT ID, MAX(CASE WHEN rn = 1 THEN age||'('||passengers||')' END) AS "Age1",
           MAX(CASE WHEN rn = 2 THEN age||'('||passengers||')' END) AS "Age2",
           MAX(CASE WHEN rn = 3 THEN age||'('||passengers||')' END) AS "Age3"
  FROM 
     (
      SELECT t.*, 
             ROW_NUMBER() OVER (PARTITION BY ID ORDER BY 0) AS rn
        FROM t     
      )
 GROUP BY ID

yang menghasilkan

ID      Age1        Age2            Age3
123456  58(Marie)   65(Ben) 
123458  32(Aaron)   18(Caroline)    37(Stephanie)

sebagai hasil yang ditetapkan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cx_Oracle dengan otentikasi Windows

  2. Bagaimana cara memasukkan catatan ke dalam variabel dari cte di Oracle?

  3. Bagaimana cara membaca nilai data NCLOB, CLOB dari database Oracle menggunakan halaman ASP Klasik?

  4. Jumlah atau jenis kesalahan argumen yang salah saat memanggil prosedur

  5. Kesalahan SQL - pemicu/fungsi mungkin tidak melihatnya