Non è possibile inserire un'istruzione dinamica nell'istruzione IN di PIVOT senza utilizzare PIVOT XML, che genera un output meno che desiderabile. Tuttavia, puoi creare una stringa IN e inserirla nella tua dichiarazione.
Innanzitutto, ecco la mia tabella di esempio;
myNumber myValue myLetter
---------- ---------- --------
1 2 A
1 4 B
2 6 C
2 8 A
2 10 B
3 12 C
3 14 A
Per prima cosa imposta la stringa da usare nella tua istruzione IN. Qui stai mettendo la stringa in "str_in_statement". Stiamo usando COLUMN NEW_VALUE e LISTAGG per impostare la stringa.
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);
La tua stringa sarà simile a:
'A' AS A,'B' AS B,'C' AS C
Ora usa l'istruzione String nella tua query PIVOT.
SELECT * FROM
(SELECT myNumber, myLetter, myValue FROM myTable)
PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));
Ecco l'output:
MYNUMBER A_VAL B_VAL C_VAL
---------- ---------- ---------- ----------
1 2 4
2 8 10 6
3 14 12
Ci sono però dei limiti. Puoi concatenare solo una stringa fino a 4000 byte.