Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Si prega di spiegare le parti di un PIVOT

Spiegazione della query pivot

FROM 
    (SELECT OtherID, Val, amount
    FROM @randomTable) p

Queste sono le colonne che diventano i "dati di base" per il pivot. Non includere colonne che non fanno nulla. Proprio come non inserisci colonne non GROUP BY nella clausola SELECT, non elenchi le colonne inutilizzate in una fonte PIVOT.

PIVOT
(
    max(amount)
    FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;

Questa parte dice che stai creando 5 nuove colonne denominate da "Val1" a "Val5". Questi nomi di colonna rappresentano valori nella colonna Val. Quindi ci si aspetta che la tua tabella contenga qualcosa del genere

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)

Quindi ora hai 5 nuove colonne che prima non esistevano. Cosa va nella colonna?

  • Qualsiasi colonna che appare nell'OUTPUT che non è una colonna PIVOT è una colonna "GRUPPO PER".
  • La funzione di aggregazione è ciò che raccoglie tutti i dati nella cella che è il CROCE tra le colonne GROUP BY e la colonna PIVOTED.

Quindi, per illustrare, utilizzando i dati di esempio sopra, abbiamo otherID=1 e val=Val1. Nella tabella di output, c'è solo una cella che rappresenta questa combinazione di Max(amount) per ogni combinazione (otherID/val)

otherID   Val1   Val2   Val3   Val4   Val5
1         <x>    ...    ...    ...    ...
(etc)

Per la cella contrassegnata con <x> , è consentito un solo valore, quindi <x> non può contenere più amount i valori. Questo è il motivo per cui dobbiamo aggregarlo, in questo caso utilizzando MAX(amount) . Quindi, in effetti, l'output è simile a questo

(unpivoted columns)   (pivoted, creates "new" columns)
otherID             |  Val1          Val2           Val3   Val4   Val5
1                   |  MAX(amount)   Max(amount)    << cell value = aggregate function
(etc)

L'istruzione SELECT è ciò che quindi restituisce queste colonne

SELECT OtherID, Val1, Val2, Val3, Val4, Val5