Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Pivot z dynamicznymi kolumnami w Oracle

SYS_REFCURSOR wewnątrz funkcji przechowywanej (np. PL/SQL używany zamiast bezpośredniego używania SQL ) może być używany w celu uzyskania dynamicznie generowanego zestawu wyników (np. Dynamic Pivot ). W takim przypadku generowany jest ciąg dla agregacji warunkowej :

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;

Dodałem również imiona i nazwiska pasażerów, aby dobrze odróżnić poszczególne dane.

Następnie uruchom poniższy kod:

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

z wiersza poleceń SQL Developer, aby zobaczyć oczekiwany zestaw wyników.

Powyższy kod generuje ten ciąg SQL (v_sql ) dla aktualnie istniejących danych

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

co daje

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

jako zestaw wyników.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekazać datatable jako dane wejściowe do procedury w C#?

  2. Jak sprawdzić format daty sesji Oracle

  3. Podstępny numer GROUP BY na ORACLE

  4. błąd sqlplus przy wyborze z tabeli zewnętrznej:ORA-29913:błąd podczas wykonywania objaśnienia ODCIEXTTABLEOPEN

  5. Uzyskaj listę wszystkich funkcji i procedur w bazie danych Oracle