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.

Publisert

Utdrag fra nettkurset «SQL for nybegynnere»Av

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.

Om kursholderen

Aina Øverås Skott kursholder hos Utdannet.no

Data Scientist

Dataforsker hos SpareBank 1 SMN med ekspertise i SAS Visual Analytics, Machine Learning, Python og SQL. Bakgrunn i nano-kjemi fra Universitetet i Oslo, med evne til å forene teknisk kunnskap med forretningsinnsikt. Underviser i Power BI og SQL på Utdannet.no. Kursene gir praktisk innføring i dataanalyse med fokus på verktøy som brukes i næringslivet.