SQL Academy · Lezione

Espressioni CASE e query pivot

Usi CASE WHEN all’interno delle aggregazioni per trasformare tabelle verticali in report a tabella incrociata

Lezione 3 di 413 passaggi

Espressioni CASE e query pivot è una lezione SQL Academy 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 Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

CASE: If/Else inline per SQL

CASE è il ternario di SQL. Esistono due forme:

-- Searched CASE
CASE WHEN x > 0 THEN 'positive'
     WHEN x < 0 THEN 'negative'
     ELSE 'zero' END

-- Simple CASE
CASE status
  WHEN 'A' THEN 'active'
  WHEN 'P' THEN 'pending'
  ELSE 'unknown'
END

CASE in SELECT

Calcoli una colonna derivata:

SELECT id, total,
       CASE
         WHEN total >= 1000 THEN 'whale'
         WHEN total >=  100 THEN 'regular'
         ELSE 'small'
       END AS bucket
FROM orders;

CASE in WHERE e ORDER BY

Filtraggio e ordinamento personalizzati:

-- Custom sort:
ORDER BY
  CASE WHEN status = 'urgent' THEN 0 ELSE 1 END,
  created_at DESC;

-- Conditional filter:
WHERE CASE WHEN $1 = 'paid' THEN status = 'paid'
           ELSE status IN ('pending','paid')
      END;

CASE negli aggregati: conteggi condizionali

Il classico trucco per creare un pivot:

SELECT user_id,
       COUNT(*) AS total,
       SUM(CASE WHEN status = 'paid'      THEN 1 ELSE 0 END) AS paid,
       SUM(CASE WHEN status = 'pending'   THEN 1 ELSE 0 END) AS pending,
       SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS cancelled
FROM orders
GROUP BY user_id;

FILTER: un'alternativa più chiara

La clausola FILTER di PostgreSQL è più leggibile:

SELECT user_id,
       COUNT(*)                                     AS total,
       COUNT(*) FILTER (WHERE status = 'paid')      AS paid,
       COUNT(*) FILTER (WHERE status = 'pending')   AS pending,
       COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled
FROM orders
GROUP BY user_id;

Creare un pivot dei mesi tra le colonne

Converta il formato long nel formato wide usando CASE + un aggregato:

SELECT year,
       SUM(CASE WHEN month =  1 THEN revenue END) AS jan,
       SUM(CASE WHEN month =  2 THEN revenue END) AS feb,
       -- ...
       SUM(CASE WHEN month = 12 THEN revenue END) AS dec
FROM monthly_revenue
GROUP BY year
ORDER BY year;

Creare un pivot delle categorie

Una riga per utente, una colonna per stato:

SELECT user_id,
       SUM(total) FILTER (WHERE status = 'paid')      AS paid_total,
       SUM(total) FILTER (WHERE status = 'pending')   AS pending_total
FROM orders GROUP BY user_id;

Limitazioni dei pivot con CASE

Deve conoscere le colonne di destinazione al momento della scrittura. Per i pivot dinamici, generi SQL nell'applicazione oppure usi PL/pgSQL procedurale.

CASE rispetto a COALESCE / NULLIF

COALESCE = "primo valore non NULL". NULLIF = "NULL se uguale". CASE è più generale: lo usi quando COALESCE/NULLIF non sono adatti.

Compatibilità dei tipi

Tutti i rami di CASE devono restituire tipi compatibili. Esegua un cast esplicito se combina tipi diversi:

SELECT CASE WHEN x THEN 1::TEXT ELSE 'no' END;

CASE annidati

Ramificazione su più livelli:

SELECT CASE
  WHEN amount IS NULL THEN 'no payment'
  WHEN amount = 0     THEN 'free'
  WHEN amount < 10    THEN 'cheap'
  ELSE
    CASE WHEN paid_at IS NULL THEN 'overdue' ELSE 'paid' END
END AS status FROM invoices;

Riepilogo

CASE è l'equivalente universale di "if/else" in SQL.

  • Colonne calcolate in SELECT
  • Pivot tramite CASE negli aggregati o FILTER
  • Logica personalizzata in WHERE / ORDER BY

Verifica rapida

Quale clausola è più leggibile per l'aggregazione condizionale in PostgreSQL?

Gratis per iniziare

Impara SQL con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
46
Lezioni
183

Domande Frequenti

La lezione «Espressioni CASE e query pivot» è gratuita?

Sì — il testo completo di «Espressioni CASE e query pivot» è 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 Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «Espressioni CASE e query pivot»?

Usi CASE WHEN all’interno delle aggregazioni per trasformare tabelle verticali in report a tabella incrociata Eserciti SQL Academy 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 Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy 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 «Espressioni CASE e query pivot»?

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 Academy?

Sì. Ogni lezione SQL Academy 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. UNION, INTERSECT, EXCEPT
  2. UNION ALL rispetto a UNION (costo della deduplicazione)
  3. Espressioni CASE e query pivot
  4. Pattern crosstab (crosstab() di PostgreSQL)
← Torna a SQL Academy