PIVOT in SQL Server

Di Matteo Lucato del 02 marzo 2020

Introduzione

Gli operatori relazionali PIVOT e UNPIVOT possono essere utilizzati nei database SQL Server per modificare un’espressione con valori di tabella in un’altra tabella. Nello specifico, PIVOT ruota i valori in tabella convertendoli  in valori di colonna, eseguendo nel mentre eventuali aggregazioni richieste. UNPIVOT invece esegue l’operazione opposta, trasformando le colonne di una tabella in valori di tabella.

Come utilizzare il comando PIVOT in T-SQL
Per dimostrazione prendiamo in esempio una relazione di questo genere.

esempio tabella pivot

La seguente query trova il numero di prodotti per ogni categoria:


SELECT
Category_Name,
COUNT(Item_id) product_count
FROM
Prodotti p
INNER JOIN Categorie_Prodotti c
ON c.Category_ID= p.Category_ID
GROUP BY
Category_Name;

 

Output:

tabella pivot 1

Il nostro obbiettivo sarà quello di ottenere una struttura del genere  partendo dalle due tabelle sopra:

tabella pivot 2

Passaggi per la creazione di una pivot table :

  • Selezionare un dataset su cui fare il pivoting.
  • Creare un risultato temporaneo usando una tabella derivata o una Common Table Expression.
  • Applicare l’operatore PIVOT tra le due tabelle.

 

Applichiamo questi passaggi riprendendo l’esempio sopra.

Creiamo il dataset su cui fare il pivoting. In questo caso prendiamo i dati relativi a Category_Name ed Item_ID


SELECT
category_name,
Item_ID
FROM
Prodotti p
INNER JOIN Categorie_Prodotti c
ON c.category_id = p.category_id

 

Secondo, creiamo un risultato temporaneo usando una tabella derivata:


SELECT * FROM (
SELECT
category_name,
Item_ID
FROM
Prodotti p
INNER JOIN Categorie_Prodotti c
ON c.category_id = p.category_id
) t

 

Terzo, Applichiamo l’operatore di PIVOT: 


SELECT * FROM
(
SELECT
category_name,
Item_id
FROM
Prodotti p
INNER JOIN Categorie_Prodotti c
ON c.category_id = p.category_id
) t
PIVOT(
COUNT(Item_ID)
FOR category_name IN (
[Biclette Corsa]
,[Biciclette Vere]
,[Biciclette Elettriche]
,[Biciclette Bimbi])
) AS pivot_table;

 

Generando così il seguente risultato:

tabella pivot 3

Ogni colonna addizionale che si aggiungerà alla lista di selezione della query che ritorna il dataset di base per il pivoting, formerà automaticamente dei raggruppamenti nella tabella finale.

Aggiungiamo ad esempio Year_Model


SELECT * FROM
(
SELECT
category_name,
Item_id,
Year_Model
FROM
Prodotti p
INNER JOIN Categorie_Prodotti c
ON c.category_id = p.category_id
) t
PIVOT(
COUNT(Item_ID)
FOR category_name IN (
[Biclette Corsa]
,[Biciclette Vere]
,[Biciclette Elettriche]
,[Biciclette Bimbi])
) AS pivot_table;

 

Si otterrà il seguente risultato:

taballa pivot 4

Conclusioni
Come abbiamo visto, lo scopo dell’operatore PIVOT è trasformare i valori univoci sulle righe in colonne, con aggregazione dei risultati, mentre UNIPIVOT ruota le colonne in righe. Queste trasformazioni sono utili per reportistica ed analisi dei dati, anche in contesti di Business Intelligence, ad esempio nella realizzazione di una dashboard.

Categorie: SQL Server

Iscriviti alla nostra Newsletter

Rimani sempre aggiornato sul mondo database e business intelligence.

Iscriviti