Spesso operando con tabelle SQL Server nasce l’esigenza di trasformare dei dati contenuti in più righe di una tabella, in una sola riga con più colonne.
SQL Server 2005 ha introdotto la funzione PIVOT per render semplice una operazione di questo genere.
La logica di questo operatore è molto simile alle tabelle PIVOT di excel.
Supponiamo di avere la seguente tabella [INCASSI_NEGOZI]:
Anno | Semestre | Negozio | Incasso |
2010 | 1 | Milano | 15.750,00 |
2010 | 1 | Roma | 14.330,00 |
2010 | 1 | Palermo | 18.440,00 |
2010 | 2 | Milano | 19.745,00 |
2010 | 2 | Roma | 18.360,00 |
2010 | 2 | Palermo | 16.980,00 |
2011 | 1 | Milano | 18.960,00 |
2011 | 1 | Roma | 21.789,00 |
2011 | 1 | Palermo | 19.712,00 |
2011 | 2 | Milano | 14.30,00 |
2011 | 2 | Roma | 11.290,00 |
2011 | 2 | Palermo | 13.630,00 |
Quello che abbiamo sono due righe per ogni anno e per ogni negozio. Supponiamo però, di voler ottenere un risultato “ruotato”, ovvero una riga per ogni negozio con gli incassi dell’anno, per cui gli anni diventano le intestazioni di colonna.
Per fare ciò l’operatore, l’utilizzo dell’operatore PIVOT semplifica notevolmente la creazione del codice. Grazie ad esso, infatti, per raggiungere il risultato voluto è sufficiente scrivere la seguente query:
SELECT Negozio, [2010], [2011]
FROM
(SELECT Negozio, [Anno], Incasso
FROM INCASSI_NEGOZI) AS tmp
PIVOT
(SUM(Incasso)
FOR [Anno] IN ([2010], [2011]))
AS PivotTable;
Dall’analisi di questo script possiamo individuare alcuni aspetti importanti:
– Nella prima SELECT vanno specificate le intestazioni delle colonne (nel nostro caso gli anni);
– Nela seconda SELECT vanno indicati i dati da estrarre;
– Con l’operatore PIVOT specifichiamo la funzione di aggregazione che vogliamo utilizzare (SUM(Incasso));
– Nella clausola FOR si indica il nome della colonna contenente i valori che diventeranno intestazioni di colonna (Anno);
– Dopo la parola chiave IN vanno indicati i valori dei campi che compariranno nelle intestazioni di colonna.
Il risultato che si ottiene è dunque il seguente:
Negozio | 2010 | 2011 |
Milano | 35.495,00 | 20.390,00 |
Palermo | 35.420,00 | 33.342,00 |
Roma | 32.690,00 | 33.079,00 |
L’operatore UNPIVOT effettua l’operazione contraria rispetto a PIVOT, ruotando le colonne in righe.