sql >> Database >  >> RDS >> Oracle

Oracle Dynamic Pivoting

Het gebruik van dynamische sql voor een resultaat waarbij de kolommen op het moment van uitvoering onbekend zijn, is een beetje een gedoe in Oracle in vergelijking met bepaalde andere RDMBS.

Omdat het recordtype voor de uitvoer nog niet bekend is, kan dit niet vooraf worden gedefinieerd.

In Oracle 11g is een manier om een ​​naamloze procedure te gebruiken die een tijdelijke tabel genereert met het gedraaide resultaat.

Selecteer vervolgens de resultaten uit die tijdelijke tabel.

declare
  v_sqlqry clob;
  v_cols clob;
begin
  -- Generating a string with a list of the unique names
  select listagg(''''||CCL||''' as "'||CCL||'"', ', ') within group (order by CCL)
  into v_cols
  from 
  (
    select distinct CCL
    from tableA
  );

  -- drop the temporary table if it exists
  EXECUTE IMMEDIATE 'DROP TABLE tmpPivotTableA';
  EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF;

  -- A dynamic SQL to create a temporary table 
  -- based on the results of the pivot
  v_sqlqry := '
    CREATE GLOBAL TEMPORARY TABLE tmpPivotTableA
    ON COMMIT PRESERVE ROWS AS
    SELECT * 
    FROM (SELECT ID, CCL, Flag FROM TableA) src 
    PIVOT (MAX(Flag) FOR (CCL) IN ('||v_cols||')) pvt';

  -- dbms_output.Put_line(v_sqlqry); -- just to check how the sql looks like
  execute immediate v_sqlqry;

end;
/

select * from tmpPivotTableA;

Retouren:

ID  adam john rob terry
--  ---- ---- --- -----
1   x    x    x
2        x      

Je kunt een test vinden op db<>fiddle hier

In Oracle 11g is nog een coole truc (gemaakt door Anton Scheffer) die kan worden gebruikt in deze blog. Maar je moet er wel de pivot-functie voor toevoegen.
De broncode vind je in deze zip

Daarna kan de SQL zo simpel zijn:

select * from 
table(pivot('SELECT ID, CCL, Flag FROM TableA'));

Je vindt een test op db<>fiddle hier



  1. Een databasemodel voor een online-enquête. Deel 3

  2. Aangepaste snelkoppelingen maken in SQL Server Management Studio (SSMS) - SQL Server / TSQL-zelfstudie, deel 10

  3. Hoe om te gaan met SQL-kolomnamen die op SQL-sleutelwoorden lijken?

  4. Prestatiegerelateerde oplossingen voor SQL Server 2012