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

Dynamický pivot v oracle sql

Dynamický příkaz nemůžete vložit do příkazu PIVOT's IN bez použití PIVOT XML, jehož výstupem je méně než žádoucí výstup. Můžete však vytvořit řetězec IN a vložit jej do příkazu.

Za prvé, zde je moje ukázková tabulka;

  myNumber    myValue myLetter
---------- ---------- --------
         1          2 A        
         1          4 B        
         2          6 C        
         2          8 A        
         2         10 B        
         3         12 C        
         3         14 A      

Nejprve nastavte řetězec, který se má použít ve vašem příkazu IN. Zde vkládáte řetězec do "str_in_statement". K nastavení řetězce používáme COLUMN NEW_VALUE a LISTAGG.

clear columns
COLUMN temp_in_statement new_value str_in_statement
SELECT DISTINCT 
    LISTAGG('''' || myLetter || ''' AS ' || myLetter,',')
        WITHIN GROUP (ORDER BY myLetter) AS temp_in_statement 
    FROM (SELECT DISTINCT myLetter FROM myTable);

Váš řetězec bude vypadat takto:

'A' AS A,'B' AS B,'C' AS C

Nyní použijte ve svém PIVOT dotazu příkaz String.

SELECT * FROM 
    (SELECT myNumber, myLetter, myValue FROM myTable)
    PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));

Zde je výstup:

  MYNUMBER      A_VAL      B_VAL      C_VAL
---------- ---------- ---------- ----------
         1          2          4            
         2          8         10          6 
         3         14                    12 

Existují však omezení. Můžete zřetězit pouze řetězec do 4000 bajtů.



  1. Jedinečné omezení s podmínkami v MYSQL

  2. Jak ukončit nástroj příkazového řádku PostgreSQLs (psql)

  3. Oracle:jak získat procento z celkového počtu dotazem?

  4. Získání všech budov v rozsahu 5 mil od zadaných souřadnic