sql >> Database >  >> RDS >> Oracle

Oracle draait rijen naar kolommen

Een optie is het gebruik van PIVOT Clausule

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

maar dit is statisch, bijv. moet worden bijgewerkt als verschillende waarden voor tipo kolom wordt toegevoegd. Om het dynamisch te maken, kun je een functie maken

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

en bel dan met

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

van de SQL-ontwikkelaarsconsole.

Demo



  1. Het linkerdeel van een tekenreeks ophalen in SQL Server (T-SQL)

  2. psql:FATAL:Identificatie mislukt voor gebruiker postgres

  3. Kan geen JDBC-verbinding maken

  4. Python-connector voor Django 1.9 en Python 3.5?