Creare una tabella Pivot con SQL

creare una tabella pivot con sql

In questo articolo vediamo come creare con l’SQL un output simile alle tabelle Pivot di Excel, contenente cioè una serie di colonne relative a tutte le possibili valorizzazioni di un attributo. Partiamo ad esempio da una tabella come questa

AnnoTrimestreFatturato
202018
2020222
2020393
2020413
202114
2021235
2021312
2021487

e di voler ottenere questo risultato

AnnoTrimestre_1Trimestre_2Trimestre_3Trimestre_4
20208229313
20204351287

Ricorda: non copiare e incollare il codice senza aver effettuato tutti i test necessari per ogni caso specifico.

 

Creiamo la tabella Pivot con l’SQL e la CASE WHEN

Una possibile implementazione in SQL prevede l’utilizzo di una GROUP BY e della funzione CASE WHEN. Vediamo il codice:

SELECT 
  Anno,
  SUM(CASE WHEN Trimestre = 1 
        THEN Fatturato
        ELSE NULL) AS Trimestre_1,
  SUM(CASE WHEN Trimestre = 2 
        THEN Fatturato
        ELSE NULL) AS Trimestre_2,
  SUM(CASE WHEN Trimestre = 3 
        THEN Fatturato
        ELSE NULL) AS Trimestre_3,
  SUM(CASE WHEN Trimestre = 4
      THEN Fatturato
      ELSE NULL) AS Trimestre_4
FROM Tabella;

Anche se un po’ lunga, questa è a mio parere l’implementazione più semplice. Inoltre nel caso in cui un trimestre non sia presente all’interno della tabella di partenza, posso decidere facilmente di visualizzare nella pivot NULL o zero modificando la condizione ELSE all’interno della CASE WHEN.

 

Utilizzo dell’operatore PIVOT su SQL Server

Su SQL Server posso raggiungere lo stesso obiettivo tramite la clausola PIVOT.

WITH CTE AS (
 SELECT Anno,
  Trimestre,
  Fatturato
FROM Tabella)
SELECT Anno,
 COALESCE([1],0) AS Trimestre_1,
 COALESCE([2],0) AS Trimestre_2,
 COALESCE([3],0) AS Trimestre_3,
 COALESCE([4],0) AS Trimestre_4
FROM CTE
PIVOT (SUM(Fatturato) 
FOR Trimestre IN ([1],[2],[3],[4]) 
) AS pvt;

Due osservazioni sul codice:

  • la funzione COALESCE (puoi approfondirla qui) è utilizzata per sostituire i NULL con zero
  • la CTE iniziale serve ad escludere eventuali altre colonne della tabella che altrimenti verrebbero implicitamente utilizzate nel calcolo.

 

Criticità dei dati in formato Pivot

Se un utente crede che nella sua dashboard finale il modo migliore di visualizzare i dati sia tramite una struttura pivot, allora ha sicuramente tutto il diritto di chiedere un implementazione del genere. Tuttavia credo che questo modo di rappresentare i dati presenti alcune criticità e quindi non bisogna abusarne:

  • potrebbe non essere chiaro quale sia il contenuto della tabella. Ad esempio nel caso precedente non è facile capire se si tratta di importi ivati o non ivati, in una valuta piuttosto che in un altra, quantità, eccetera.
  • con i dati organizzati in questo modo risulta molto difficile effettuare ulteriori analisi con l’SQL. Supponiamo di avere una colonna per ogni mese, per calcolare l’importo totale di un anno dovrei sommare tutte e dodici le colonne! O ancor peggio, supponiamo di voler calcolare lo scostamento percentuale in un mese tra due anni consecutivi. Probabilmente saremo costretti a riportare preliminarmente i dati nella forma tradizionale tramite un’operazione di UNPIVOT.
  • nell’esercizio proposto possiamo essere sicuri che la colonna trimestre contenga sempre quei quattro valori. Ma supponiamo di voler effettuare una Pivot su una colonna contenente le categorie di un prodotto. A meno di scrivere del codice dinamico, ogni volta dovremmo modificare il codice per aggiungere il nuovo prodotto.
  • ci allontaniamo dal modello relazionale. Più che una tabella, definirei l’output una matrice.

Valutiamo infine di spostare l’operazione di Pivot dal Database relazionale all’eventuale software utilizzato per creare le Dashboard (ad esempio Sql Server Reporting Services o Excel). Molti di questi software permettono infatti di creare Pivot con pochi e semplici click.

 

Continua a esercitarti

Torna su