Tips hoe te groeperen in SQL

Stijn Janssen

Stijn Janssen werkt al ruim 11 jaar bij Vijfhart IT-Opleidingen als trainer. Zijn expertise ligt op het gebied van Oracle PL/SQL, HTML5, CSS, Angular en Java.

Groeperen in SQL wordt door velen een lastig onderwerp gevonden. In deze blog geeft Stijn wat tips om je begripsvorming van SQL te kickstarten!

Groepsfunctie

Duplo is een eenvoudig middel om ons de mogelijkheden van groeperen te laten zien. Groeperen in SQL kan nodig zijn wanneer we een speciaal type berekening willen uitvoeren. Dit type berekening noemen wij een groepsfunctie. We hebben dan de mogelijkheid om ook groepen te maken waar we deze berekening(en) over willen uitvoeren met behulp van de zogeheten group by clausule.

We gaan er bij de komende voorbeelden vanuit dat we een stapel van verschillende kleuren en vormen blokken hebben:

Groeperen in SQL Groeperen in SQL

Groeperen in SQLWe gebruiken een tabel waarin wij deze blokken bijhouden. Dit is ook de tabel waarvoor wij onze queries zullen schrijven (zie tabel hiernaast).

Wat misschien al opvalt is dat er geen gele kubussen zijn.

Belangrijk is om eerst de zeven verschillende groepsfuncties te kennen. We kunnen ze stuk voor stuk toepassen op een kolom of met de hand ingetypte waarden.

  • AVG, berekent een gemiddelde waarde van een kolom over een aantal rijen heen
  • COUNT, telt hoeveel cellen in een kolom zijn gevuld
  • MAX, geeft de hoogste waarde uit de kolom
  • MIN, geeft de laagste waarde uit de kolom
  • SUM, totale waarde berekenen uit de kolom
  • STDDEV, standaard afwijking berekenen
  • VARIANCE, variatie berekenen
Stappenplan: Aantal blokken in de verzameling

Stel dat we de volgende vraag willen beantwoorden:

“We willen het totaal aantal blokken weten in de verzameling”

Dan is het een kwestie van volgen van het volgende stappenplan:

  1. Herken dat je één van de zeven groepsfuncties moet gebruiken?
  2. Vraag jezelf af of deze berekening gedaan moet worden over alle waarden in de tabel (binnen de specifieke kolom), of ‘per iets’ of ‘voor ieder’?.Hiermee bedoel ik:
    Wil je het hoogste aantal gewonnen voetbal wedstrijden uit de competitie weten? (waarbij alle gespeelde wedstrijden met scores in één tabel onder elkaar staan). Of wil je per team het hoogste aantal gewonnen wedstrijden weten? Of misschien wel per maand, per divisie, per land, enzovoorts!
  3. Wil je ‘per iets’ of ‘voor ieder’ de groepsfunctie(s) berekenen? Dan mag je het statement:GROUP BYToevoegen aan je query, gevolgd door de kolom waarop je wilt groeperen (dus: per …..). Deze clausule staat altijd direct ná de FROM (of na de WHERE indien er ook een WHERE clausule aanwezig is). Bijvoorbeeld:GROUP BY kolomnaam

Voor onze vraag: “We willen het totaal aantal blokken weten in de verzameling” geldt volgens het bovenstaande stappenplan:

  1. Ja, ‘totaal aantal’ vertalen wij naar de functie ‘sum()’, deze telt de waarden in een kolom bij elkaar op. De ‘count()’ functie telt het aantal rijen.
  2. Nee, niet per iets, gewoon het totaal over alle blokken. Je mag nu echter niet meer kolommen opvragen in je SELECT clausule middels deze opbouw.
  3. N.v.t.

Onze query wordt nu:

SELECT  sum(aantal)
FROM   duplo;

Ons resultaat wordt dan:

Groeperen in SQL

Er komt dus één resultaat uit: het antwoord op een berekening (groepsfunctie) op de hele kolom.

Stappenplan: Aantal blokken per kleur

We gaan nu onze vraagstelling en daarmee onze query aanpassen. Stel dat wij willen weten:

“Toon het aantal blokken per kleur”

Dan krijgen we de volgende antwoorden op ons stappenplan:

  1. Ja, ‘sum()’, om waarden in de ‘aantal’ kolom op te tellen
  2. ‘Per iets’, namelijk per kleur
  3. GROUP BY kleur

Onze query wordt nu:

SELECT         kleur, sum(aantal)
FROM          duplo
GROUP BY  kleur

We hebben zoals je kunt zien óók de kolom ‘kleur’ in de SELECT clausule gezet. Dit zorgt er enkel en alleen voor dat deze kolom ook in het resultaat wordt getoond. Zouden wij dit niet doen, dan krijgen we enkel een lijstje met totalen te zien, niet wetend bij elke kleuren deze horen.

Ons resultaat is nu:

Groeperen in SQL Groeperen in SQL

Uiteraard zou je dit ook met het aantal verschillende vormen (count) of andere groepsfuncties kunnen combineren.

Onze query wordt dan:

SELECT         kleur, count(distinct vorm), sum(aantal)
FROM          duplo
GROUP BY  kleur

nb: het keyword distinct kan in deze situatie nog achterwege gelaten worden i.v.m. reeds unieke rijen in onze tabel.

Wat resulteert in:

Groeperen in SQL

Wil je meer over groeperen horen, zien en ervaren? Schrijf je dan in voor onze SQL Fundamenten deel 1 cursus.

GROUP BY uitbreiden

Als laatste is het ook mogelijk je GROUP BY uit te breiden met zogeheten GROUPING SETS om in één query te kunnen groeperen op meerdere groepen. Dit kan bijvoorbeeld middels de volgende query, waarin wij het totaal aantal stenen tonen per kleur én ernaast ook per vorm:

SELECT         kleur, vorm, sum(aantal)
FROM          duplo
GROUP BY  GROUPING SETS (kleur, vorm)

Met als resultaat:
Groeperen in SQL

Meer over GROUPING SETS beleef je in onze SQL Fundamenten deel 2 cursus.

Tot slot

Ga hier lekker zelf mee aan de slag, bijvoorbeeld via Oracle Live SQL. Experimenteer en probeer. Kom je niet verder? Kom gezellig bij ons een super praktische cursus volgen, waar je altijd wat aan hebt!

Tot die tijd, wat handige tips om te onthouden:

  • Lijst met groepsfuncties: avg(), count(), max(), min(), sum(), stddev(), variance().
  • Een aantal stelregels om te onthouden: iedere kolom zonder groepsfunctie die staat in je SELECT, moet terugkomen in je GROUP BY.


Script om hier zelf mee aan de slag te gaan:

create table Duplo (

id number constraint duplo_pk primary key,

kleur varchar2(4000),

vorm varchar2(4000),

aantal number

);

/

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (‘1′,’Rood’,’Balk’,’4′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (‘2′,’Rood’,’Kubus’,’1′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (‘3′,’Rood’,’Kubusschuin’,’2′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (‘4′,’Geel’,’Balk’,’3′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (‘5′,’Geel’,’Kubusschuin’,’1′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (‘6′,’Blauw’,’Balk’,’2′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (‘7′,’Blauw’,’Kubus’,’3′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (‘8′,’Blauw’,’Kubusschuin’,’1′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (‘9′,’Groen’,’Balk’,’1′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (’10’,’Groen’,’Kubus’,’4′);

INSERT INTO Duplo(id,kleur,vorm,aantal) VALUES (’11’,’Groen’,’kubusschuin’,’2′);

Onderwerpen
Actieve filters: Wis alle filters
Pageloader
PRIVACY VOORWAARDEN

Jouw persoonsgegevens worden opgenomen in onze beschermde database en worden niet aan derden verstrekt. Je stemt hiermee in dat wij jou van onze aanbiedingen op de hoogte houden. In al onze correspondentie zit een afmeldmogelijkheid