0Pricing
SQL Interview Prep · Lezione

Trasformare le colonne in righe

Come invertire le tabelle con struttura ampia usando UNPIVOT o UNION ALL.

Trasformare le colonne in righe è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.

Il problema inverso

L'unpivoting è l'immagine speculare del pivoting: si prende una tabella larga e si trasformano nuovamente le sue colonne in righe. Gli intervistatori lo chiedono quando i dati arrivano in formato da foglio di calcolo, ma devono essere normalizzati per l'analisi.

Esempio: una tabella con le colonne q1, q2, q3, q4 per ogni regione deve diventare un insieme di righe (region, quarter, amount). È questo formato lungo che aggregazioni, join e grafici preferiscono.

-- Wide input we want to unpivot
region | q1  | q2  | q3  | q4
-------+-----+-----+-----+----
East   | 100 | 150 | 120 | 180
West   | 200 | 250 | 210 | 260

Il pattern portabile UNION ALL

La risposta indipendente dal dialetto è UNION ALL: scrivete una SELECT per ogni colonna sorgente, producendo ogni volta un'etichetta letterale e il valore di quella colonna.

Usate UNION ALL, non UNION, così non sostenete il costo dell'eliminazione dei duplicati e conservate ogni riga, anche quando due celle condividono lo stesso valore.

SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL
SELECT region, 'Q2', q2 FROM wide_sales
UNION ALL
SELECT region, 'Q3', q3 FROM wide_sales
UNION ALL
SELECT region, 'Q4', q4 FROM wide_sales;

Perché UNION ALL e non UNION

È una classica trappola da colloquio. UNION rimuove le righe duplicate dall'intero risultato. Se East e West avessero entrambe 100 per il Q1, un semplice UNION unirebbe le righe identiche e perdereste dei dati.

UNION ALL concatena senza eliminare i duplicati, proprio ciò che serve per l'unpivoting. È anche più veloce, perché non richiede un ordinamento o un hash per eliminare i duplicati.

-- UNION would wrongly merge identical (region, quarter, amount) rows
-- UNION ALL keeps every row, always the correct choice here

Allineamento dei tipi di colonna

Ogni ramo di UNION ALL deve produrre lo stesso numero di colonne, con tipi compatibili e nello stesso ordine. I nomi delle colonne vengono dalla prima SELECT.

Se le colonne della tabella larga differiscono per tipo (ad esempio una è int e un'altra decimal), il motore sceglie un tipo comune. Se sono realmente incompatibili, eseguite un cast esplicito per evitare che l'unione fallisca.

SELECT region, 'revenue' AS metric, CAST(revenue AS decimal(12,2)) AS val FROM t
UNION ALL
SELECT region, 'units',   CAST(units   AS decimal(12,2))        FROM t;

UNPIVOT di SQL Server

SQL Server dispone dell'operatore dedicato UNPIVOT, più conciso di UNION ALL. Indicate la nuova colonna dei valori, la nuova colonna delle etichette ed elencate le colonne sorgente da riunire.

Un comportamento importante: UNPIVOT elimina le righe in cui il valore è NULL. Gli intervistatori verificano se conoscete questo effetto collaterale.

SELECT region, quarter, amount
FROM wide_sales
UNPIVOT (
  amount FOR quarter IN (q1, q2, q3, q4)
) AS u;

UNPIVOT elimina i NULL

Se una regione ha NULL in q3, UNPIVOT di SQL Server omette semplicemente quella riga dall'output. Se vi serve una riga per ogni colonna, indipendentemente dai NULL, ricorrete a UNION ALL, che li conserva.

Esplicitate questo compromesso durante un colloquio: l'UNPIVOT nativo è conciso ma perde i NULL; UNION ALL è prolisso ma completo.

-- UNPIVOT: q3 NULL for East -> no (East, Q3) row produced
-- UNION ALL: (East, 'Q3', NULL) row IS produced

PostgreSQL: LATERAL VALUES

PostgreSQL non dispone di UNPIVOT, ma offre un idioma ordinato basato su CROSS JOIN LATERAL e un elenco VALUES. Ogni riga larga viene espansa tramite una piccola tabella inline di coppie (etichetta, valore).

È più pulito di un lungo UNION ALL e legge la tabella sorgente una sola volta.

SELECT w.region, v.quarter, v.amount
FROM wide_sales w
CROSS JOIN LATERAL (VALUES
  ('Q1', w.q1),
  ('Q2', w.q2),
  ('Q3', w.q3),
  ('Q4', w.q4)
) AS v(quarter, amount);

Leggere la tabella una sola volta

È utile sollevare un aspetto legato alle prestazioni: il semplice UNION ALL esegue una scansione della tabella larga per ogni ramo (quattro scansioni per quattro trimestri). La forma LATERAL VALUES e UNPIVOT di SQL Server leggono invece la sorgente una sola volta.

Su tabelle di grandi dimensioni questo è importante. Se dovete usare UNION ALL, un ottimizzatore potrebbe comunque eseguire scansioni ripetute; menzionate quindi LATERAL o UNPIVOT come opzioni più efficienti.

Filtrare le celle vuote

Con UNION ALL o LATERAL conservate le righe con valori NULL. Se la domanda richiede solo le celle valorizzate, aggiungete un filtro. In questo modo imitate ciò che SQL Server UNPIVOT fa automaticamente.

Decidere se conservare o eliminare i NULL dipende dal contesto; chiarite quindi il requisito con l'intervistatore prima di scrivere il codice.

SELECT region, quarter, amount
FROM (
  SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
  UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
) t
WHERE amount IS NOT NULL;

Esempio svolto: aggregazione dopo l'unpivot

Un caso comune successivo: «dalla tabella trimestrale in formato largo, restituisca il ricavo totale per regione su tutti i trimestri». Una volta convertiti i dati in formato lungo con l'unpivot, l'aggregazione è banale: un singolo SUM raggruppato per regione.

Questo dimostra il vero motivo per cui conviene eseguire prima l'unpivot. Sommare quattro colonne separate è fragile, mentre un SUM(amount) GROUP BY region in formato lungo si adatta a qualsiasi numero di trimestri.

WITH long_sales AS (
  SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
  UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
  UNION ALL SELECT region, 'Q3', q3 FROM wide_sales
  UNION ALL SELECT region, 'Q4', q4 FROM wide_sales
)
SELECT region, SUM(amount) AS total
FROM long_sales
GROUP BY region;

Quando usare l'unpivot

Riconosca il segnale che indica la necessità di un unpivot in un problema descritto a parole:

  • L'input contiene colonne ripetute che in realtà rappresentano valori (mesi, anni, metriche).
  • È necessario aggregare, unire o creare grafici in base a tali valori.
  • Si desidera normalizzare, durante l'importazione, i dati de-normalizzati di un foglio di calcolo.

Il formato lungo è quasi sempre la struttura giusta per il lavoro SQL successivo, quindi l'unpivot è spesso il primo passaggio.

Verifica rapida

Verifichi di conoscere l'insidia più comune dell'unpivot.

Riepilogo

L'unpivot trasforma le colonne in righe:

  • Portabile: un SELECT per colonna, unito con UNION ALL (mai con UNION semplice).
  • SQL Server: UNPIVOT nativo, conciso ma elimina i valori NULL.
  • Postgres: CROSS JOIN LATERAL (VALUES ...), con una sola scansione.
  • Allinei il numero e i tipi delle colonne tra i vari rami; filtri i NULL se la domanda lo richiede.

Domande Frequenti

La lezione «Trasformare le colonne in righe» è gratuita?

Sì — il testo completo di «Trasformare le colonne in righe» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.

Cosa imparerò in «Trasformare le colonne in righe»?

Come invertire le tabelle con struttura ampia usando UNPIVOT o UNION ALL. Eserciti SQL Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Interview Prep?

Non è richiesta alcuna esperienza precedente. SQL Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Trasformare le colonne in righe»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Interview Prep?

Sì. Ogni lezione SQL Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Pivot con aggregazione condizionale
  2. Sintassi PIVOT e crosstab specifica del database
  3. Trasformare le colonne in righe
  4. Pivot dinamici con colonne sconosciute
← Torna a SQL Interview Prep