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