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:
- SELECT
- FROM
- WHERE (filtrerer rader)
- GROUP BY (grupperer rader)
- HAVING (filtrerer grupper)
- 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.



