Om resultaten in SQL te groeperen op een of meerdere kolommen kun je GROUP BY gebruiken. Door het groeperen voorkom je dat gegevens meermaals terugkomen.
Het gebruik van GROUP BY in SQL
In SQL groepeer je de resultaten altijd op één of meerdere kolommen. Alles waardes uit deze kolomgroep worden dan samengevoegd. Zo’n query ziet er als volgt uit:
SELECT kolomnaam FROM Tabelnaam GROUP BY kolomnaam
Gaan we als voorbeeld uit van een tabel daarin Klantgegevens, dan kunnen we groeperen op basis van bijvoorbeeld plaatsnaam. Komt een plaatsnaam twee keer in de tabel voor, dan zal hij in het resultaat slechts eenmaal terug te vinden zijn.
SELECT plaatsnaam FROM Klant GROUP BY plaatsnaam
Wil je bijvoorbeeld ook de voornaam tonen, dan kun je deze uiteraard in de select opnemen. Het resultaat is dat je niet weet zeker welke naam je terug krijgt. Daarom is het in SQL verstandig om alle kolommen die je in de SELECT opneemt ook op te nemen in de GROUP BY.
SELECT voornaam, plaatsnaam FROM Klant GROUP BY voornaam, plaatsnaam
Combinatie met een aggregatiefunctie
In SQL gebruik je de GROUP BY meestal in combinatie met een aggregatiefunctie. Dit zijn bijvoorbeeld AVG
, COUNT
, MAX
, MIN
en SUM
. Zo’n functie voert een berekening uit over een resultset en kunnen we onder andere gebruiken in de SELECT.
Goede voorbeelden voor het gebruik van zo’n aggregatiefunctie is bijvoorbeeld het berekenen van een totaal of het gemiddelde van een bepaalde kolom. Gebruik je zo’n functie dan is het aan te bevelen om deze een alias te geven, dat maakt het wat makkelijker om deze te benaderen in het resultaat.
Let op: Zonder GROUP BY in de SQL-query wordt dit over de hele tabel gedaan. Ga je echter groeperen op kolommen, dan wordt de functie uitgevoerd over de gegroepeerde gegevens.
SELECT k.voornaam, k.achternaam, SUM(o.orderbedrag) as totaal_orderbedrag
FROM Klant k
INNER JOIN Order o ON o.klantid = k.id
GROUP BY k.voornaam, k.achternaam
In het bovenstaande voorbeeld halen we de SUM van het orderbedrag op, daarnaast groeperen we het resultaat ook op de voornaam en achternaam. Omdat ik de gegevens nodig heb uit twee tabellen, gebruik ik in het voorbeeld een INNER JOIN. Dit maakt het mogelijk om gegevens uit meerdere tabellen op te vragen.
Voorbeeld van GROUP BY in de praktijk
Om het eenvoudig te houden nemen we de volgende dataset van de inhoud van de tabel Order.
ordernummer, klantnaam, orderbedrag 1, 'Henk Janssen', '23.20' 2, 'Mieke Sterk', '2.30' 3, 'Sjoerd Vermeulen', '12.93' 4, 'Mieke Sterk', '54.92' 5, 'Henk Janssen', '6.12' 6, 'Mieke Sterk', '9.60'
We willen een lijst opvragen van alle orders met daarin de klantnaam en het totale orderbedrag. Het totale orderbedrag berekenen we in dit geval met de SUM
functie. Dat is een aggregatiefunctie, dus we willen daarom GROUP BY
gebruiken, anders krijgen we de som van alle records uit de tabel.
SELECT klantnaam, SUM( orderbedrag ) FROM Orders GROUP BY klantnaam
Resultaat: 'Henk Janssen', '29.32' 'Mieke Sterk', '66.82'