Slik grupperer du data med GROUP BY i SQL

Lær å gruppere data med GROUP BY i SQL. Aggregeringsfunksjoner, kategoriske kolonner og praktiske eksempler. Gratis video.

Du har en kundetabell med en kolonne for land, og du vil vite hvor mange kunder du har i hvert land. Du kan ikke løse det med WHERE eller ORDER BY alene. Du trenger en måte å samle rader i grupper og beregne noe for hver gruppe. Det er akkurat det GROUP BY gjør.

GROUP BY deler radene inn i grupper basert på verdiene i én eller flere kolonner, og lar deg bruke aggregatfunksjoner som COUNT, SUM og AVG på hver gruppe.

Telle rader per gruppe

Det mest grunnleggende eksempelet er å telle hvor mange rader som finnes i hver gruppe:

SELECT country, COUNT(*) FROM customers GROUP BY country;

Denne spørringen grupperer alle kunder etter land og teller antall kunder i hvert land. Resultatet kan se slik ut: Brazil 5, Canada 8, Norway 1. Hver unike verdi i country-kolonnen blir en gruppe, og COUNT(*) teller radene i hver gruppe.

Legg merke til at kolonnen du grupperer på (country) også er med i SELECT. Det er en viktig regel: alle kolonner i SELECT må enten være i GROUP BY eller inne i en aggregatfunksjon.

Aggregatfunksjoner

GROUP BY brukes nesten alltid sammen med aggregatfunksjoner. De vanligste er:

  • COUNT(*) teller antall rader i gruppen
  • SUM(kolonne) summerer verdiene
  • AVG(kolonne) beregner gjennomsnittet
  • MAX(kolonne) finner høyeste verdi
  • MIN(kolonne) finner laveste verdi

Du kan bruke flere aggregatfunksjoner i samme spørring:

SELECT customer_id, COUNT(*) , SUM(total), AVG(total) FROM invoices GROUP BY customer_id;

Her får du antall fakturaer, total sum og gjennomsnittlig beløp per kunde. Alt i én spørring.

Gruppere på kategoriske kolonner

GROUP BY gir mest mening på kolonner med gjentakende verdier, altså kategoriske data. Typiske eksempler er land, by, avdeling, produktkategori eller status.

Å gruppere på en kolonne med unike verdier (som en ID-kolonne) gir deg én rad per gruppe, noe som sjelden er nyttig. Det er som å «gruppere» uten å faktisk samle noe.

Filtrere før gruppering med WHERE

WHERE filtrerer rader før GROUP BY kjører. Det betyr at du kan begrense hvilke rader som inngår i grupperingen:

SELECT country, COUNT(*) FROM customers WHERE country != 'USA' GROUP BY country;

Denne utelukker alle amerikanske kunder før grupperingen. Resultatet viser antall kunder per land, men USA er ikke med. Rekkefølgen er viktig: WHERE kommer alltid før GROUP BY i spørringen.

Gruppere på flere kolonner

Du kan gruppere på flere kolonner samtidig ved å separere dem med komma:

SELECT country, city, COUNT(*) FROM customers GROUP BY country, city;

Nå er hver unike kombinasjon av land og by en egen gruppe. Du ser ikke bare «Brazil: 5 kunder», men «Brazil, São Paulo: 3 kunder» og «Brazil, Rio de Janeiro: 2 kunder». Jo flere kolonner du grupperer på, jo mer detaljert blir resultatet.

Rekkefølgen i spørringen

GROUP BY plasseres etter FROM og WHERE, men før HAVING og ORDER BY:

  1. SELECT
  2. FROM
  3. WHERE (filtrerer rader)
  4. GROUP BY (grupperer rader)
  5. HAVING (filtrerer grupper)
  6. ORDER BY (sorterer resultatet)

En vanlig kombinasjon er å gruppere, beregne, og deretter sortere:

SELECT country, COUNT(*) AS antall FROM customers GROUP BY country ORDER BY antall DESC;

Denne viser landene med flest kunder først. AS antall gir kolonnen et lesbart navn som du kan referere til i ORDER BY.

Regelen om SELECT og GROUP BY

Her er en regel som forvirrer mange nybegynnere: alle kolonner i SELECT må enten stå i GROUP BY eller være inne i en aggregatfunksjon. Bryter du denne regelen, får du feilmelding i de fleste databaser.

For eksempel er dette feil:

SELECT country, city, COUNT(*) FROM customers GROUP BY country;

Problemet er at city ikke er i GROUP BY og ikke i en aggregatfunksjon. Databasen vet ikke hvilken by den skal vise for hvert land (det kan jo være flere). Du må enten legge city i GROUP BY eller fjerne den fra SELECT.

SQLite er mer tilgivende enn andre databaser her og gir ikke alltid feilmelding, men resultatet kan bli uforutsigbart. Det er best å følge regelen uansett hvilken database du bruker. W3Schools har flere eksempler på GROUP BY hvis du vil se flere varianter.

COUNT(*) vs. COUNT(kolonne)

En viktig detalj med GROUP BY: COUNT(*) og COUNT(kolonne) gir ulike resultater når kolonnen inneholder NULL-verdier. COUNT(*) teller alle rader i gruppen, mens COUNT(kolonne) bare teller rader der kolonnen har en verdi. Velg riktig variant basert på hva du faktisk vil telle.

Vanlige feil med GROUP BY

  • Glemme aggregatfunksjonen. GROUP BY uten COUNT, SUM eller lignende gir deg bare unike verdier. Det fungerer, men da kan du like gjerne bruke SELECT DISTINCT.
  • Ha kolonner i SELECT som ikke er i GROUP BY. Dette gir feil i de fleste databaser. Sørg for at alle ikke-aggregerte kolonner er med i GROUP BY.
  • Bruke WHERE for å filtrere på aggregater. WHERE filtrerer rader, ikke grupper. For å filtrere på resultatet av COUNT eller SUM trenger du HAVING.

Neste steg

GROUP BY er grunnlaget for all aggregering i SQL. Neste steg er å lære HAVING for å filtrere grupper basert på aggregerte verdier. Du bør også forstå hvordan NULL-verdier oppfører seg i gruppering og aggregering.

Denne videoen er hentet fra kurset SQL for nybegynnere på Utdannet.no. I kurset jobber du med en ekte database og bygger opp SQL-kunnskapen din fra grunnen av.