0Pricing
Coding Interview Prep · Lezione

Pivot con aggregazione condizionale

Lo schema portabile CASE-interno-a-SUM per trasformare le righe in colonne.

Pivot con aggregazione condizionale è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 1 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 Coding Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Coding Interview Prep include 4 lezioni in totale.

Lo scenario del colloquio

Uno dei compiti più comuni nei colloqui sulla reportistica consiste nel trasformare le righe in colonne. Si dispone di una tabella lunga come sales(region, quarter, amount) e l'intervistatore desidera un report ampio con una colonna per trimestre.

La risposta portabile e indipendente dal dialetto che desidera sentire è l'aggregazione condizionale: un'espressione CASE inserita in un aggregato come SUM. Padroneggiando questo schema, potrà eseguire il pivot in qualsiasi database, anche in quelli che non dispongono della parola chiave PIVOT.

Forma lunga e forma larga

Prima di eseguire il pivot, definiamo le due strutture. La forma lunga memorizza un fatto per riga: ogni coppia regione/trimestre occupa la propria riga. La forma larga distribuisce una categoria tra le colonne.

  • Lunga: facile da inserire, difficile da leggere affiancata.
  • Larga: ottima per un report destinato a essere letto da una persona.

Un pivot trasforma la forma lunga in forma larga. Questo piace agli intervistatori perché verifica la comprensione dell'aggregazione, non solo della sintassi.

-- Long form (the input)
region | quarter | amount
-------+---------+-------
East   | Q1      | 100
East   | Q2      | 150
West   | Q1      | 200
West   | Q2      | 250

Lo schema fondamentale

Il trucco consiste nello scrivere, per ogni colonna di output, un CASE che restituisca il valore quando la riga corrisponde a quella colonna e NULL altrimenti. Lo si racchiude in un aggregato, in modo che il gruppo venga ridotto a una sola riga per chiave.

Lo si può leggere così: sommi l'importo, ma solo per le righe Q1. Poiché SUM ignora NULL, le righe non corrispondenti non contribuiscono al risultato.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

Perché SUM ignora NULL

Questo schema funziona per un fatto che gli intervistatori verificheranno: le funzioni di aggregazione ignorano i valori NULL. Un CASE senza ELSE restituisce NULL quando nessun ramo corrisponde, quindi SUM(CASE WHEN ... THEN amount END) somma solo le righe selezionate.

Se scrivesse ELSE 0, funzionerebbe comunque con SUM (aggiungere zero non modifica il risultato), ma altererebbe il comportamento di AVG, MIN e COUNT.

-- Both produce the same SUM result:
SUM(CASE WHEN quarter = 'Q1' THEN amount END)
SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END)

Esempio svolto: report trimestrale

Ecco la query completa sui dati di esempio. Ogni regione diventa una riga; ogni trimestre diventa una colonna.

È GROUP BY region a ridurre le quattro righe di input a due righe di output. Senza di esso, otterreste una riga per ogni riga di input, con la maggior parte dei valori NULL.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

-- Result:
-- region | q1  | q2
-- East   | 100 | 150
-- West   | 200 | 250

Scegliere l'aggregazione corretta

L'aggregazione che racchiude il CASE deve corrispondere alla domanda:

  • SUM quando ogni cella somma dei valori.
  • MAX o MIN quando ogni coppia regione/trimestre ha esattamente un valore e volete semplicemente riportarlo.
  • COUNT quando ogni cella conta le righe corrispondenti.

Nei colloqui viene spesso chiesta la variante con COUNT: quanti ordini ci sono per stato e per mese?

SELECT
  month,
  COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped,
  COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled
FROM orders
GROUP BY month;

MAX per celle con un solo valore

Quando ogni coppia chiave/categoria contiene un solo valore (un vero crosstab, non un totale), usate MAX o MIN. Entrambi restituiscono l'unico valore non NULL e ignorano i NULL dei rami non corrispondenti.

È la scelta sicura quando state riorganizzando attributi anziché sommare importi, ad esempio per trasformare una tabella di impostazioni chiave/valore in una riga per entità.

-- Turn key/value rows into one wide row per user
SELECT
  user_id,
  MAX(CASE WHEN attr = 'city'  THEN value END) AS city,
  MAX(CASE WHEN attr = 'plan'  THEN value END) AS plan
FROM user_attributes
GROUP BY user_id;

Gestire le celle di output NULL

Se una regione non ha avuto vendite nel Q2, la sua cella q2 risulta NULL. Durante un colloquio potrebbe esservi chiesto di mostrare invece 0. Racchiudete l'intera aggregazione in COALESCE.

Applicate COALESCE all'esterno dell'aggregazione, non all'interno del CASE, così sostituite il valore solo quando l'intero gruppo non contiene righe corrispondenti.

SELECT
  region,
  COALESCE(SUM(CASE WHEN quarter = 'Q1' THEN amount END), 0) AS q1,
  COALESCE(SUM(CASE WHEN quarter = 'Q2' THEN amount END), 0) AS q2
FROM sales
GROUP BY region;

Aggiungere una colonna del totale generale

Una richiesta successiva comune è aggiungere un totale di tutte le colonne sottoposte a pivot. Non è necessario sommare le colonne indicandole per nome. Un semplice SUM(amount) sullo stesso gruppo fornisce il totale della riga, perché ignora completamente il filtraggio del CASE.

In questo modo dimostrate all'intervistatore di aver capito che ogni aggregazione nella SELECT viene calcolata indipendentemente sullo stesso gruppo.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2,
  SUM(amount) AS total
FROM sales
GROUP BY region;

La scorciatoia delle aggregazioni filtrate

PostgreSQL e lo standard SQL supportano FILTER (WHERE ...), un modo più chiaro di scrivere l'aggregazione condizionale. La sintassi è più leggibile ed evita il codice ripetitivo del CASE.

Menzionatela durante un colloquio per dimostrare la vostra preparazione, ma sappiate che MySQL e SQL Server non la supportano; perciò CASE resta la risposta portabile.

-- Postgres / standard SQL
SELECT
  region,
  SUM(amount) FILTER (WHERE quarter = 'Q1') AS q1,
  SUM(amount) FILTER (WHERE quarter = 'Q2') AS q2
FROM sales
GROUP BY region;

Il grande limite

L'aggregazione condizionale ha un limite su cui gli intervistatori insistono: dovete elencare manualmente ogni colonna di output. Se i trimestri o le categorie non sono noti in anticipo, questa query statica non può adattarsi.

Questo problema si chiama pivot dinamico e richiede SQL generato dinamicamente. Per un insieme fisso e noto di categorie, però, l'aggregazione condizionale è la soluzione più pulita e portabile.

Verifica rapida

Verificate la vostra comprensione del pattern dell'aggregazione condizionale.

Riepilogo

L'aggregazione condizionale è il pivot portabile accettato da ogni intervistatore:

  • Un CASE per ogni colonna di output, racchiuso in un'aggregazione.
  • SUM per i totali, MAX/MIN per le celle con un singolo valore, COUNT per i conteggi.
  • Funziona perché le aggregazioni ignorano il NULL dei rami non corrispondenti.
  • Usate COALESCE per trasformare le celle vuote in 0.
  • Limite: le colonne devono essere codificate esplicitamente, il che porta al tema dei pivot dinamici.

Domande Frequenti

La lezione «Pivot con aggregazione condizionale» è gratuita?

Sì — il testo completo di «Pivot con aggregazione condizionale» è 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 Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.

Cosa imparerò in «Pivot con aggregazione condizionale»?

Lo schema portabile CASE-interno-a-SUM per trasformare le righe in colonne. Eserciti Coding 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 Coding Interview Prep?

Non è richiesta alcuna esperienza precedente. Coding 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 1 di 4.

Quanto tempo richiede la lezione «Pivot con aggregazione condizionale»?

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 Coding Interview Prep?

Sì. Ogni lezione Coding 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 Coding Interview Prep