sql >> Databasteknik >  >> RDS >> Oracle

Dynamisk pivot i oracle sql

Du kan inte lägga in en dynamisk sats i PIVOT:s IN-sats utan att använda PIVOT XML, som matar ut något mindre än önskvärt. Du kan dock skapa en IN-sträng och mata in den i ditt uttalande.

Först, här är min exempeltabell;

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

Ställ först in strängen som ska användas i din IN-sats. Här lägger du strängen i "str_in_statement". Vi använder COLUMN NEW_VALUE och LISTAGG för att ställa in strängen.

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

Din sträng kommer att se ut så här:

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

Använd nu String-satsen i din PIVOT-fråga.

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

Här är utdata:

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

Det finns dock begränsningar. Du kan bara sammanfoga en sträng på upp till 4000 byte.



  1. Återställer exempel på DW Database AdventureWorksDW2019

  2. hur man skriver nummer till ord-funktion i sql-server

  3. Datagenerering och hårdvarukvalitet

  4. Finns det något sätt att spola ut utdata från PL/SQL i Oracle?