Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pivot dynamique dans oracle sql

Vous ne pouvez pas placer une instruction dynamique dans l'instruction IN de PIVOT sans utiliser PIVOT XML, qui produit une sortie moins que souhaitable. Cependant, vous pouvez créer une chaîne IN et l'entrer dans votre instruction.

Tout d'abord, voici mon exemple de tableau ;

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

Configurez d'abord la chaîne à utiliser dans votre instruction IN. Ici, vous mettez la chaîne dans "str_in_statement". Nous utilisons COLUMN NEW_VALUE et LISTAGG pour configurer la chaîne.

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

Votre chaîne ressemblera à :

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

Utilisez maintenant l'instruction String dans votre requête PIVOT.

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

Voici la sortie :

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

Il y a cependant des limites. Vous ne pouvez concaténer une chaîne que jusqu'à 4000 octets.