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

Buat tampilan Pivot di SQL dari tabel SQL

Fungsi tersimpan(atau prosedur ) mungkin dibuat untuk membuat SQL untuk Dynamic Pivoting, dan kumpulan hasil dimuat ke dalam variabel tipe SYS_REFCURSOR :

CREATE OR REPLACE FUNCTION Get_Categories_RS RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767);
  v_cols_1    VARCHAR2(32767);
  v_cols_2    VARCHAR2(32767);  
BEGIN
  SELECT LISTAGG( ''''||"level"||''' AS "'||"level"||'"' , ',' )
          WITHIN GROUP ( ORDER BY "level" DESC )
    INTO v_cols_1
    FROM (
          SELECT DISTINCT "level"
            FROM temp
          );

  SELECT LISTAGG( 'MAX(CASE WHEN category = '''||category||''' THEN "'||"level"||'" END) AS "'||"level"||'_'||category||'"' , ',' )
          WITHIN GROUP ( ORDER BY category, "level" DESC )
    INTO v_cols_2
    FROM (
          SELECT DISTINCT "level", category
            FROM temp
          );

  v_sql :=
  'SELECT "set", '|| v_cols_2 ||'
     FROM
     (
      SELECT *
        FROM temp
       PIVOT
       (
        MAX(value) FOR "level" IN ( '|| v_cols_1 ||' )
       )
      )
      GROUP BY "set"
      ORDER BY "set"'; 

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;

di mana saya menggunakan dua tingkat pivot:yang pertama ada di dalam kueri dalam yang melibatkan PIVOT Klausa, dan yang kedua ada di kueri luar yang memiliki logika agregasi bersyarat. Perhatikan bahwa urutan level harus dalam urutan menurun ( Z , Y , X ) dalam hasil yang diharapkan sesuai dengan deskripsi.

Dan kemudian panggil

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

dari Baris Perintah Pengembang SQL untuk mendapatkan set hasil

Btw, hindari menggunakan kata kunci khusus seperti set dan level seperti dalam kasus Anda. Saya perlu mengutipnya agar dapat menggunakannya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. apa yang terjadi di fase adopsi bersiaplah

  2. Apa operator rangkaian string di Oracle?

  3. Masalah membangun cx_Oracle - libclntsh.so.11.1 => tidak ditemukan

  4. cara mendapatkan kolom seperti rowNum di sqlite IPHONE

  5. Masalah saat membandingkan hasil to_char(myDate, 'DAY') dengan string