Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Pivot dinâmico no Oracle sql


Você não pode colocar uma instrução dinâmica na instrução IN do PIVOT sem usar PIVOT XML, que gera uma saída menos do que desejável. No entanto, você pode criar uma string IN e inseri-la em sua instrução.

Primeiro, aqui está minha tabela de exemplo;
  myNumber    myValue myLetter
---------- ---------- --------
         1          2 A        
         1          4 B        
         2          6 C        
         2          8 A        
         2         10 B        
         3         12 C        
         3         14 A      

Primeiro configure a string a ser usada em sua instrução IN. Aqui você está colocando a string em "str_in_statement". Estamos usando COLUMN NEW_VALUE e LISTAGG para configurar a string.
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);

Sua string ficará assim:
'A' AS A,'B' AS B,'C' AS C

Agora use a instrução String em sua consulta PIVOT.
SELECT * FROM 
    (SELECT myNumber, myLetter, myValue FROM myTable)
    PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));

Aqui está a Saída:
  MYNUMBER      A_VAL      B_VAL      C_VAL
---------- ---------- ---------- ----------
         1          2          4            
         2          8         10          6 
         3         14                    12 

No entanto, existem limitações. Você só pode concatenar uma string de até 4.000 bytes.