Un Blog su SQL Server e dintorni organizzato In Pillole

Pivot ed Unpivot in Sql Server

Quando decidiamo di analizzare un set di dati non manca la situazione in cui ci accorgiamo di volerli prima trasformare per poi applicare le nostre query.

Il PIVOT è quell’operazione che ci permette di portare in colonna alcuni valori che troviamo espressi in riga. L’UN-PIVOT esegue l’operazione inversa, trasla in riga le colonne della nostra tabella.

Potremmo rappresentare idealmente le operazioni in questo modo:

Rappresentazione di esempio di un PIVOT ed UNPIVOT.

La tabella originale (in alto a sinistra) mostra un dettaglio delle vendite per ogni venditore ed anno di riferimento.

Il risultato del pivot (tabella in basso a destra) vede traslati in colonna gli anni, che prima vedevano rappresentati in riga. Per ogni venditore troveremo il numero di vendite di un determinato anno direttamente in colonna. Otterremo un NULL quando il valore portato in colonna non esiste per la riga.

Questo tipo di comando ci torna molto utile quando vogliamo raggruppare i nostri dati dando particolare importanza a qualche specifico valore del nostro insieme.

Nel nostro esempio, ci siamo chiesti la quantità di vendite effettuata dal nostro venditore in uno specifico anno. La comodità del PIVOT è quella di nobilitare un anno specifico traslandolo in colonna.

Come sempre, prima di qualsiasi altra spiegazione, trovate un’ottima documentazione sull’msdn a quest’indirizzo.

Passiamo a qualche esempio pratico.

Creiamo la tabella di cui sopra ed aggiungiamo qualche dato di test:

CREATE TABLE StatisticheVendite (
  Venditore nvarchar(128) not null,
  Anno int not null,
  NumeroVendite int not null
);

INSERT INTO StatisticheVendite (Venditore, Anno, NumeroVendite) VALUES
('Giulio', 2021, 28),
('Francesco', 2021, 36),
('Paolo', 2022, 1847),
('Giulio', 2022, 749),
('Francesco', 2022, 364);

In questo modo possiamo eseguire il pivot:

SELECT Venditore, [2021], [2022]  
FROM  
(
  SELECT Venditore, Anno, NumeroVendite   
  FROM StatisticheVendite
) AS TabellaDaTrasformare  
PIVOT  
(  
  SUM(NumeroVendite)  
  FOR Anno IN ([2021], [2022])  
) AS TabellaTrasformata;
Risultato del PIVOT.

Partendo invece dalla tabella già “traslata” possiamo eseguire l’UNPIVOT:

-- creiamo un tabella temporanea #TEMP per comodità
SELECT Venditore, [2021], [2022]  
INTO #TEMP
FROM  
(
  SELECT Venditore, Anno, NumeroVendite   
  FROM StatisticheVendite
) AS TabellaDaTrasformare  
PIVOT  
(  
  SUM(NumeroVendite)  
  FOR Anno IN ([2021], [2022])  
) AS TabellaTrasformata;


-- eseguiamo l'unpivot
SELECT Venditore, Anno, NumeroVendite  
FROM   
   (SELECT * FROM #TEMP) p  
UNPIVOT  
   (NumeroVendite FOR Anno IN ([2021], [2022])  
)AS TabellaOriginale;
Risultato dell’UNPIVOT.

Spero l’articolo possa esservi utile come punto di partenza per capire il funzionamento base del comando.

In ogni caso vi consiglio sempre di approfondire dalle fonti ufficiali ed eventualmente farmi sapere cosa ne pensate dell’articolo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *