SQL Server – Come trasformare più righe di una tabella in colonne

di | 3 Aprile 2012
Spread the love

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.