SQL Academy · Lektion

CASE i ORDER BY og aggregater

Betinget sortering og optælling.

Lektion 4 af 413 trin

CASE i ORDER BY og aggregater er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 4 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.

Sortering med brugerdefineret prioritet

SQL's ORDER BY-klausul sorterer normalt rækker efter en kolonnes naturlige værdi. Men du kan indlejre et CASE-udtryk i ORDER BY for at oprette en helt brugerdefineret sorteringsrækkefølge – en rækkefølge, som ingen enkelt kolonne kan frembringe alene.

Denne teknik er nyttig, når forretningsregler bestemmer prioriteten frem for rå dataværdier.

SELECT product_name, status
FROM products
ORDER BY
  CASE status
    WHEN 'urgent'   THEN 1
    WHEN 'active'   THEN 2
    WHEN 'pending'  THEN 3
    ELSE                 4
  END;

Sådan fungerer CASE i ORDER BY

Når databasen evaluerer ORDER BY CASE ... END, beregner den et heltal (eller en anden værdi, der kan sammenlignes) for hver række. Rækkerne sorteres derefter efter denne beregnede værdi i stedet for – eller ud over – en rå kolonne.

CASE-udtrykket gemmes ikke; det eksisterer kun, mens forespørgslen kører.

SELECT order_id, priority
FROM orders
ORDER BY
  CASE priority
    WHEN 'high'   THEN 1
    WHEN 'medium' THEN 2
    WHEN 'low'    THEN 3
    ELSE               9
  END,
  order_id;

Eksplicit sortering af NULL-værdier

Som standard placerer forskellige databaser NULL-værdier i begyndelsen eller slutningen af et sorteret resultat på forskellige måder. Med et CASE i ORDER BY kan du bestemme præcis, hvor NULL-værdierne placeres – uanset databasemotoren.

SELECT employee_name, manager_id
FROM employees
ORDER BY
  CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END,
  manager_id;

Betinget stigende og faldende sortering

Et CASE i ORDER BY kan også efterligne en betinget sorteringsretning. Ved at knytte kategoriværdier til negative tal kan du effektivt vende sorteringsrækkefølgen for bestemte grupper, samtidig med at andre grupper sorteres normalt.

Det er nyttigt, når forskellige rækketyper kræver forskellig sorteringslogik i ét resultatsæt.

SELECT task_name, due_date, is_overdue
FROM tasks
ORDER BY
  CASE WHEN is_overdue = 1 THEN 0 ELSE 1 END,
  due_date;

CASE i COUNT

Du kan indlejre et CASE-udtryk i en aggregatfunktion som COUNT. Tricket er at returnere en værdi, der ikke er NULL, for de rækker, du vil tælle, og NULL for de rækker, du vil springe over – fordi COUNT ignorerer NULL-værdier.

SELECT
  COUNT(CASE WHEN status = 'active'   THEN 1 END) AS active_count,
  COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;

CASE i SUM – betingede totaler

Hvis du placerer CASE i SUM, kan du lægge værdier sammen, kun når en betingelse er sand, og behandle rækker, der ikke opfylder betingelsen, som nul. Dette er et meget almindeligt mønster til pivotbaserede rapporter, der opdeler én kolonne i flere kolonner med måltal.

SELECT
  SUM(CASE WHEN region = 'North' THEN sales_amount ELSE 0 END) AS north_total,
  SUM(CASE WHEN region = 'South' THEN sales_amount ELSE 0 END) AS south_total,
  SUM(CASE WHEN region = 'East'  THEN sales_amount ELSE 0 END) AS east_total
FROM sales;

Betinget AVG med CASE

Det samme mønster fungerer med AVG. Da AVG ignorerer NULL-værdier, giver det gennemsnittet af kun de rækker, der matcher, at du returnerer NULL for de rækker, du vil udelukke – uden behov for en underforespørgsel.

SELECT
  AVG(CASE WHEN department = 'Engineering' THEN salary END) AS avg_eng_salary,
  AVG(CASE WHEN department = 'Marketing'   THEN salary END) AS avg_mkt_salary
FROM employees;

Gruppering med CASE – kategorisering af rækker

Du kan bruge CASE i listen over GROUP BY eller SELECT til at opdele kontinuerte værdier i kategorier og derefter aggregere hver kategori. Det omdanner en numerisk kolonne til grupper med etiketter uden at ændre de underliggende data.

SELECT
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END AS age_group,
  COUNT(*) AS user_count
FROM users
GROUP BY
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END;

Brug af et alias i stedet for at gentage CASE

Det er omstændeligt at gentage et langt CASE-udtryk i både SELECT og GROUP BY. Nogle databaser (MySQL, PostgreSQL med løsninger) lader dig referere til aliaset i ORDER BY, men ikke i GROUP BY. Den sikreste tilgang på tværs af databaser er at omslutte forespørgslen i en underforespørgsel eller CTE og gruppere efter aliaset derfra.

WITH scored AS (
  SELECT
    customer_id,
    CASE
      WHEN total_spent >= 1000 THEN 'Gold'
      WHEN total_spent >= 500  THEN 'Silver'
      ELSE                          'Bronze'
    END AS tier
  FROM customers
)
SELECT tier, COUNT(*) AS customer_count
FROM scored
GROUP BY tier
ORDER BY
  CASE tier
    WHEN 'Gold'   THEN 1
    WHEN 'Silver' THEN 2
    ELSE               3
  END;

Kombination af ORDER BY CASE med ASC / DESC

Efter CASE-udtrykket kan du stadig tilføje ASC eller DESC og tilføje flere sorteringskolonner adskilt af kommaer. CASE-værdien er blot den første sorteringsnøgle; efterfølgende kolonner afgør rækkefølgen ved ens værdier på normal vis.

SELECT
  ticket_id,
  category,
  created_at
FROM support_tickets
ORDER BY
  CASE category
    WHEN 'billing'  THEN 1
    WHEN 'outage'   THEN 2
    WHEN 'feature'  THEN 3
    ELSE                 4
  END ASC,
  created_at ASC;

Eksempel fra virkeligheden — salgsdashboard

Her er en realistisk forespørgsel, der kombinerer en CASE-baseret aggregering med en CASE-baseret sortering. Den laver en salgsoversigt pr. region, sorteret sådan at regionen med den højeste omsætning altid vises først, mens 'Andre' placeres nederst.

SELECT
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END AS region_label,
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_sales,
  COUNT(CASE WHEN status = 'refunded' THEN 1 END)           AS refund_count
FROM orders
GROUP BY
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END
ORDER BY completed_sales DESC;

Videnstjek

Kontrollér din forståelse af brugen af CASE i ORDER BY og aggregeringsfunktioner.

Opsummering af lektionen

I denne lektion har du lært at kombinere CASE med ORDER BY og aggregeringsfunktioner:

  • CASE i ORDER BY — tildel rækker brugerdefinerede sorteringsværdier, styr, hvor NULL-værdier vises, og kombiner flere sorteringsregler i én forespørgsel.
  • CASE i COUNT — returnér en værdi, der ikke er NULL, for rækker, der skal medtages, og NULL (implicit eller eksplicit) for rækker, der skal springes over.
  • CASE i SUM / AVG — brug 0 eller NULL som ELSE-værdi til at beregne betingede totaler og gennemsnit i én gennemkørsel.
  • CASE i GROUP BY — inddel kontinuerte eller kategoriske værdier i navngivne grupper til aggregering.

Disse mønstre eliminerer behovet for mange underforespørgsler og gør det enkelt at skrive rapporter i pivot-stil med almindelig SQL.

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 i ORDER BY og aggregater” gratis?

Ja — hele teksten til “CASE i ORDER BY og aggregater” 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 i ORDER BY og aggregater”?

Betinget sortering og optælling. 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 4 af 4.

Hvor lang tid tager lektionen “CASE i ORDER BY og aggregater”?

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. CASE-udtrykket
  2. Searched kontra simple CASE
  3. Gruppering og mærkning af data
  4. CASE i ORDER BY og aggregater
← Tilbage til SQL Academy