sql >> Database >  >> RDS >> Oracle

Dynamische spil in orakel sql

U kunt geen dynamische instructie in de IN-instructie van de PIVOT plaatsen zonder PIVOT XML te gebruiken, die minder dan wenselijke uitvoer oplevert. U kunt echter een IN-tekenreeks maken en deze in uw verklaring invoeren.

Ten eerste, hier is mijn voorbeeldtabel;

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

Stel eerst de tekenreeks in die u in uw IN-instructie wilt gebruiken. Hier zet je de string in "str_in_statement". We gebruiken COLUMN NEW_VALUE en LISTAGG om de string in te stellen.

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

Je tekenreeks ziet er als volgt uit:

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

Gebruik nu de String-instructie in uw PIVOT-query.

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

Hier is de uitvoer:

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

Er zijn echter beperkingen. U kunt een string van maximaal 4000 bytes samenvoegen.



  1. 1052:Kolom 'id' in veldlijst is dubbelzinnig

  2. Fatale fout:[] operator niet ondersteund voor strings

  3. Hoe Java Date op Mysql datetime op te slaan met JPA

  4. Detecteren of een waarde ten minste één numeriek cijfer bevat in Oracle