Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Dynamisches Pivot in Oracle SQL

Sie können keine dynamische Anweisung in die IN-Anweisung von PIVOT einfügen, ohne PIVOT-XML zu verwenden, das eine weniger als wünschenswerte Ausgabe ausgibt. Sie können jedoch einen IN-String erstellen und in Ihre Anweisung eingeben.

Zuerst ist hier meine Beispieltabelle;

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

Richten Sie zuerst die Zeichenfolge ein, die in Ihrer IN-Anweisung verwendet werden soll. Hier fügen Sie die Zeichenfolge in "str_in_statement" ein. Wir verwenden COLUMN NEW_VALUE und LISTAGG, um die Zeichenfolge einzurichten.

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

Ihre Zeichenfolge sieht folgendermaßen aus:

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

Verwenden Sie nun die String-Anweisung in Ihrer PIVOT-Abfrage.

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

Hier ist die Ausgabe:

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

Es gibt jedoch Einschränkungen. Sie können nur eine Zeichenfolge bis zu 4000 Bytes verketten.