Saltar al contenido

Pivote dinámico en Oracle SQL

Solución:

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 declaración.

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

Tu cuerda 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.

No puedes poner una cadena no constante en el IN cláusula de la cláusula pivote.
Puede usar Pivot XML para eso.

De la documentación:

subconsulta Una subconsulta se usa solo junto con la palabra clave XML. Cuando especifica una subconsulta, todos los valores encontrados por la subconsulta se utilizan para pivotar

Debe tener un aspecto como este:

select xmlserialize(content t.B_XML) from t_aa
pivot xml(
sum(A) for B in(any)
) t;

También puede tener una subconsulta en lugar de la ANY palabra clave:

select xmlserialize(content t.B_XML) from t_aa
pivot xml(
sum(A) for B in (select cl from t_bb)
) t;

Aquí hay una demostración de sqlfiddle

Para lectores posteriores, aquí hay otra solución https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/

permitiendo una consulta como

select * from table( pivot(  'select deptno,  job, count(*) c from scott.emp group by deptno,job' ) )
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *