Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por favor, explique as partes de um PIVOT


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