sql >> Base de Datos >  >> RDS >> Oracle

Pivote dinámico en Oracle sql

No puede poner una declaración dinámica en la declaración IN de PIVOT sin usar PIVOT XML, que genera una salida menos que deseable. Sin embargo, puede crear una cadena IN e ingresarla en su extracto.

Primero, aquí está mi tabla de muestra;

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

Primero configure la cadena para usar en su declaración IN. Aquí está poniendo la cadena en "str_in_statement". Estamos usando COLUMN NEW_VALUE y LISTAGG para configurar la cadena.

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

Su cadena se verá así:

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

Ahora use la instrucción String en su consulta PIVOT.

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

Aquí está la salida:

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

Sin embargo, existen limitaciones. Solo puede concatenar una cadena de hasta 4000 bytes.