sql >> Databáze >  >> RDS >> Oracle

Oracle kontingenční řádky do sloupců

Jednou z možností by bylo použití PIVOT Ustanovení

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" )
 )  

ale to je statické, např. je třeba aktualizovat jako různé hodnoty pro tipo sloupec je přidán. Aby to bylo dynamické, můžete vytvořit funkci

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;
/

a poté zavolejte pomocí

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

z vývojářské konzole SQL.

Ukázka



  1. Jak vytvořit inicializátor pro vytvoření a migraci databáze mysql?

  2. ORA-6502 se spouštěčem protokolování Grant

  3. Jak uspořádat a seskupit výsledky MySQL

  4. Codeigniter ActiveRecord:připojit zpětné zaškrtnutí