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

Oracle pivot baris ke kolom

Salah satu opsi adalah menggunakan PIVOT Klausa

SELECT *
  FROM (SELECT t1.*, t2.tipo, t2.valor 
          FROM table1 t1 
          JOIN table2 t2 
            ON t2.id = t1.id)
 PIVOT 
 (
  MAX(valor) FOR tipo IN ( 't1' AS "t1", 't2' AS "t2", 't3' AS "t3" )
 )  

tapi ini statis, mis. perlu diperbarui sebagai nilai yang berbeda untuk tipo kolom ditambahkan. Untuk membuatnya dinamis, Anda dapat membuat fungsi

CREATE OR REPLACE FUNCTION Get_Pivoted_Cols RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767); 
  v_cols      VARCHAR2(32767);      
BEGIN
  SELECT LISTAGG( ''''||tipo||''' AS "'||tipo||'"' , ',' )
          WITHIN GROUP ( ORDER BY tipo )  
    INTO v_cols
    FROM ( SELECT DISTINCT tipo FROM table2 );

  v_sql := 'SELECT *
              FROM (SELECT t1.*, t2.tipo, t2.valor 
                      FROM table1 t1 
                      JOIN table2 t2 
                        ON t2.id = t1.id)
             PIVOT 
             (
              MAX(valor) FOR tipo IN ( '|| v_cols ||' )
             )';   

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;
/

lalu panggil dengan menggunakan

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

dari konsol pengembang SQL.

Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nonaktifkan dan kemudian aktifkan semua indeks tabel di Oracle

  2. Bagaimana cara melewatkan nilai di blok anonim dengan parameter tabel plsql

  3. VM pengembang Oracle dengan Oracle 11g

  4. mengecilkan database di oracle 11g

  5. Menyalin baris dalam tabel yang sama tanpa harus mengetikkan 50+ nama kolom (sambil mengubah 2 kolom)