SQL Academy · Lektion

CASE-udtryk og pivotforespørgsler

Brug CASE WHEN i aggregater til at omdanne lange tabeller til brede krydstabeller.

Lektion 3 af 413 trin

CASE-udtryk og pivotforespørgsler er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

CASE: Indlejret hvis/ellers i SQL

CASE er SQL's ternære operator. Der er to former:

-- 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 i SELECT

Beregn en afledt kolonne:

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

CASE i WHERE og ORDER BY

Tilpasset filtrering og sortering:

-- 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 i aggregater: betingede optællinger

Det klassiske pivoteringstrick:

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: Et renere alternativ

PostgreSQL's FILTER-klausul er mere læsevenlig:

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;

Pivotering af måneder på tværs af kolonner

Konvertér fra langt format til bredt format med CASE + aggregat:

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;

Pivotering af kategorier

Én række pr. bruger, én kolonne pr. status:

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;

Begrænsninger ved CASE-pivotering

Du skal kende målkolonnerne, når du skriver forespørgslen. Ved dynamisk pivotering kan du generere SQL i applikationen eller bruge procedurebaseret PL/pgSQL.

CASE vs COALESCE / NULLIF

COALESCE = "første værdi, der ikke er NULL". NULLIF = "NULL hvis ens". CASE er mere generel — brug den, når COALESCE/NULLIF ikke passer.

Typ kompatibilitet

Alle CASE-grene skal give kompatible typer. Konvertér typer eksplicit, hvis du blander typer:

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

Indlejret CASE

Forgrening i flere niveauer:

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;

Opsummering

CASE er SQL's universelle "hvis/ellers".

  • Beregnede kolonner med SELECT
  • Pivotering via CASE i aggregater eller FILTER
  • Tilpasset logik i WHERE / ORDER BY

Hurtigt tjek

Hvilken klausul er mest læsevenlig til betinget aggregering i PostgreSQL?

Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “CASE-udtryk og pivotforespørgsler” gratis?

Ja — hele teksten til “CASE-udtryk og pivotforespørgsler” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “CASE-udtryk og pivotforespørgsler”?

Brug CASE WHEN i aggregater til at omdanne lange tabeller til brede krydstabeller. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “CASE-udtryk og pivotforespørgsler”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. UNION, INTERSECT, EXCEPT
  2. UNION ALL kontra UNION (omkostninger ved deduplikering)
  3. CASE-udtryk og pivotforespørgsler
  4. Crosstab-mønstre (PostgreSQL crosstab())
← Tilbage til SQL Academy