PIVOT in SQL Server

Datamaze
22.06.20 03:56 PM Comment(s)

Cosa sono PIVOT e UNPIVOT

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.


PIVOT in SQL Server


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


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


Tabella PIVOT in SQL Server


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
Tabella Pivot SQL Server


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 derivata


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:


Tabella PIVOT unita SQL Server


Ecco l'esempio di PIVOT utilizzato in questo articolo spiegato in un video tutorial:

Conclusioni

Come abbiamo visto, lo scopo dell’operatore PIVOT è trasformare i valori univoci sulle righe in colonne, con aggregazione dei risultati, mentre UNPIVOT 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.


di Matteo Lucato, pubblicato il 2 marzo 2020


Ti è piaciuto il nostro articolo? Continua a seguirci!