Explicação da consulta dinâmica
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Estas são as colunas que se tornam os "dados base" para o pivô. Não inclua colunas que não fazem nada. Assim como você não coloca colunas não GROUP BY na cláusula SELECT, você não lista colunas não utilizadas em uma fonte PIVOT.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Esta parte diz que você está criando 5 novas colunas chamadas "Val1" a "Val5". Esses nomes de coluna representam valores na coluna Val. Portanto, espera-se que sua tabela contenha algo assim
otherID Val amount
1 Val1 1
2 Val2 2
1 Val3 3
1 Val1 5
(etc) (this column contains one of Val1 - Val5, or null)
Então agora você tem 5 novas colunas que não existiam antes. O que vai na coluna?
- Qualquer coluna que apareça em OUTPUT que não seja uma coluna PIVOTed é uma coluna "GROUP BY".
- A função agregada é o que coleta todos os dados na célula que é o CROSS entre as colunas GROUP BY e a coluna PIVOTED.
Então, para ilustrar, usando os dados de exemplo acima, temos otherID=1 e val=Val1. Na tabela de saída, há apenas uma célula representando essa combinação de Max(amount) para cada combinação (otherID/val)
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
Para a célula marcada como
<x>
, apenas um valor é permitido, então <x>
não pode conter vários amount
valores. Essa é a razão pela qual precisamos agregá-lo, neste caso usando MAX(amount)
. Então, na verdade, a saída se parece com isso (unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
A instrução SELECT é o que gera essas colunas
SELECT OtherID, Val1, Val2, Val3, Val4, Val5