0Pricing
SQL Interview Prep · Lezione

Sintassi PIVOT e crosstab specifica del database

PIVOT di SQL Server e crosstab di Postgres, con i relativi limiti.

Sintassi PIVOT e crosstab specifica del database è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 2 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.

Oltre l'aggregazione condizionale

Conoscete già il pivot portabile con CASE. Ma gli intervistatori vogliono anche sapere se siete in grado di usare gli operatori di pivot specifici del database quando sono disponibili.

SQL Server include l'operatore dedicato PIVOT. PostgreSQL offre la funzione crosstab nell'estensione tablefunc. Conoscere entrambi, insieme ai loro punti critici, dimostra esperienza reale.

Anatomia di PIVOT in SQL Server

Il PIVOT di SQL Server richiede tre elementi:

  • Un'aggregazione sulla colonna dei valori.
  • Una clausola FOR che indica la colonna i cui valori diventeranno nuove colonne.
  • Un elenco IN dei valori letterali da trasformare in colonne.

Deve essere applicato a una tabella derivata che esponga esattamente la chiave, la colonna di distribuzione e il valore, senza nient'altro.

SELECT region, [Q1], [Q2]
FROM (SELECT region, quarter, amount FROM sales) AS src
PIVOT (
  SUM(amount)
  FOR quarter IN ([Q1], [Q2])
) AS p;

Il GROUP BY implicito

Un'insidia sottile di PIVOT che gli intervistatori verificano è il raggruppamento implicito. SQL Server raggruppa per ogni colonna della sorgente che NON è la colonna aggregata né la colonna FOR.

Quindi, se la tabella derivata include accidentalmente una colonna aggiuntiva come order_id, anche quella verrà usata per il raggruppamento e otterrete molte più righe del previsto. Riducete sempre la query interna alla sola chiave, colonna di distribuzione e valore.

-- WRONG: order_id leaks in and breaks grouping
FROM (SELECT region, quarter, amount, order_id FROM sales) AS src
PIVOT (SUM(amount) FOR quarter IN ([Q1],[Q2])) AS p;
-- The pivot now groups by region AND order_id

Nomi di colonna tra parentesi quadre

In SQL Server i nomi delle colonne sottoposte a pivot sono i valori letterali dei dati, racchiusi tra parentesi quadre. Se un valore inizia con una cifra o contiene spazi, le parentesi quadre sono obbligatorie.

Nella SELECT esterna dovete selezionarli usando lo stesso nome tra parentesi quadre. Questo spiega anche perché PIVOT non può gestire valori sconosciuti senza SQL dinamico: l'elenco IN è codificato esplicitamente.

SELECT region, [2023], [2024]
FROM (SELECT region, yr, amount FROM sales) AS s
PIVOT (SUM(amount) FOR yr IN ([2023], [2024])) AS p;

crosstab in PostgreSQL

PostgreSQL non dispone della parola chiave PIVOT. L'estensione tablefunc fornisce invece crosstab, una funzione che accetta una stringa SQL e riorganizza il relativo output.

Dovete prima abilitare l'estensione. crosstab richiede che la query sorgente restituisca esattamente tre colonne, in quest'ordine: identificatore di riga, categoria e valore.

CREATE EXTENSION IF NOT EXISTS tablefunc;

SELECT *
FROM crosstab(
  'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);

L'elenco di definizione delle colonne

La parte più soggetta a errori di crosstab è l'elenco di definizione delle colonne finale AS ct(...). Dovete dichiarare personalmente i nomi e i tipi delle colonne di output, che devono corrispondere al numero e all'ordine delle categorie.

Se manca una categoria per una riga, crosstab la inserisce in base alla posizione; ciò può disallineare i dati, a meno che non usiate la forma a due argomenti riportata di seguito.

SELECT *
FROM crosstab(
  'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);
-- ct(...) MUST list every output column and its type

crosstab a due argomenti

Per evitare disallineamenti quando alcune righe non contengono determinate categorie, usate la forma a due argomenti. La seconda query restituisce l'elenco completo e ordinato dei valori delle categorie, così crosstab sa esattamente in quale colonna inserire ogni valore.

Questa è la forma robusta che gli intervistatori si aspettano quando le categorie sono sparse.

SELECT *
FROM crosstab(
  'SELECT region, quarter, amount FROM sales ORDER BY 1, 2',
  'SELECT DISTINCT quarter FROM sales ORDER BY 1'
) AS ct(region text, q1 numeric, q2 numeric);

MySQL non supporta nessuno dei due

Se l'intervistatore vi chiede di MySQL, la risposta è diretta: MySQL non dispone né di PIVOT né di crosstab. L'unica opzione è l'aggregazione condizionale con CASE (oppure la forma abbreviata SUM(... ) + IF()).

È proprio per questo che il pattern portabile con CASE è così apprezzato: è il minimo comune denominatore che funziona ovunque.

-- MySQL: only conditional aggregation works
SELECT
  region,
  SUM(IF(quarter = 'Q1', amount, 0)) AS q1,
  SUM(IF(quarter = 'Q2', amount, 0)) AS q2
FROM sales
GROUP BY region;

Esempio svolto: conteggi degli stati in SQL Server

Una richiesta di report: "una riga per regione, con una colonna che conti gli ordini per ogni stato". In SQL Server, fornite a PIVOT una tabella derivata ridotta usando COUNT.

Poiché contate direttamente la colonna dello stato, viene conteggiata ogni riga con stato non NULL in un gruppo. La SELECT esterna elenca ogni stato come colonna tra parentesi quadre. È l'alternativa concisa alla scrittura di tre espressioni COUNT(CASE ...).

SELECT region, [pending], [shipped], [delivered]
FROM (SELECT region, status FROM orders) AS src
PIVOT (
  COUNT(status)
  FOR status IN ([pending], [shipped], [delivered])
) AS p;

Limiti comuni

Sia PIVOT sia crosstab condividono lo stesso limite fondamentale dell'aggregazione condizionale: le colonne di output devono essere note quando scrivete la query.

  • SQL Server: l'elenco IN è letterale.
  • crosstab di Postgres: l'elenco di definizione delle colonne è letterale.

Nessuno dei due può scoprire le categorie a runtime. Per farlo è necessario costruire dinamicamente la stringa SQL.

Quale scegliere?

Una buona risposta a un colloquio li confronta con obiettività:

  • Aggregazione con CASE: portabile, leggibile e compatibile con ogni motore. È la scelta predefinita.
  • PIVOT di SQL Server: conciso per molte colonne, ma il raggruppamento implicito può sorprendere.
  • crosstab di Postgres: potente ma prolisso; richiede un'estensione e un elenco di definizione delle colonne.

In caso di dubbio, scegliete l'aggregazione condizionale e menzionate gli operatori del database come alternative.

Verifica rapida

Precisate il comportamento di SQL Server PIVOT che gli intervistatori verificano.

Riepilogo

La sintassi dei pivot specifici del database in un'unica schermata:

  • SQL Server: PIVOT (SUM(x) FOR col IN ([a],[b])), con un GROUP BY implicito sulle colonne rimanenti.
  • Postgres: crosstab() da tablefunc, che richiede un elenco di definizione delle colonne; usate la forma a due argomenti per i dati sparsi.
  • MySQL: nessuno dei due è disponibile, usate CASE.
  • Per tutti e tre le colonne devono essere note al momento della scrittura della query.

Domande Frequenti

La lezione «Sintassi PIVOT e crosstab specifica del database» è gratuita?

Sì — il testo completo di «Sintassi PIVOT e crosstab specifica del database» è 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 «Sintassi PIVOT e crosstab specifica del database»?

PIVOT di SQL Server e crosstab di Postgres, con i relativi limiti. 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 2 di 4.

Quanto tempo richiede la lezione «Sintassi PIVOT e crosstab specifica del database»?

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