Pivots maken met conditionele aggregatie
Het draagbare patroon met CASE binnen SUM om rijen in kolommen om te zetten.
Pivots maken met conditionele aggregatie is een gratis Voorbereiding op SQL-sollicitatiegesprekken-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op SQL-sollicitatiegesprekken. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.
De interviewopgave
Een van de meest voorkomende interviewopgaven over rapportage is: zet rijen om in kolommen. Je hebt een lange tabel zoals sales(region, quarter, amount) en de interviewer wil een breed rapport met één kolom per kwartaal.
Het overdraagbare, dialectonafhankelijke antwoord is conditionele aggregatie: een CASE-expressie binnen een aggregatiefunctie zoals SUM. Als je dit beheerst, kun je in elke database een draaitabel maken, zelfs in databases zonder het sleutelwoord PIVOT.
Lange versus brede vorm
Voordat je een draaitabel maakt, benoem je de vormen. De lange vorm slaat één gegeven per rij op: elk paar regio/kwartaal staat op een eigen rij. De brede vorm verspreidt een categorie over kolommen.
- Lange vorm: eenvoudig in te voegen, lastig naast elkaar te lezen.
- Brede vorm: uitstekend voor een rapport voor eindgebruikers.
Een draaitabel zet lang om in breed. Interviewers waarderen dit omdat het test of je aggregatie begrijpt en niet alleen de syntaxis.
-- Long form (the input)
region | quarter | amount
-------+---------+-------
East | Q1 | 100
East | Q2 | 150
West | Q1 | 200
West | Q2 | 250Het kernpatroon
De truc: schrijf voor elke kolom in de uitvoer een CASE die de waarde teruggeeft wanneer de rij bij die kolom hoort, en anders NULL. Plaats die in een aggregatiefunctie, zodat de groep wordt samengevoegd tot één rij per sleutel.
Lees het als: tel het bedrag op, maar alleen voor de Q1-rijen. Omdat SUM NULL negeert, dragen de niet-overeenkomende rijen niets bij.
SELECT
region,
SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;Waarom SUM NULL negeert
Dit patroon werkt dankzij één feit waar interviewers op zullen doorvragen: aggregatiefuncties slaan NULL over. Een CASE zonder ELSE geeft NULL terug wanneer geen enkele vertakking overeenkomt. Daarom telt SUM(CASE WHEN ... THEN amount END) alleen de rijen op die je hebt geselecteerd.
Als je in plaats daarvan ELSE 0 schrijft, werkt dat ook voor SUM (het optellen van nul verandert niets), maar het werkt niet goed voor AVG, MIN en COUNT.
-- Both produce the same SUM result:
SUM(CASE WHEN quarter = 'Q1' THEN amount END)
SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END)Uitgewerkt voorbeeld: kwartaalrapport
Hier staat de volledige query op basis van de voorbeeldgegevens. Elke regio wordt één rij en elk kwartaal één kolom.
Met GROUP BY region worden de vier invoerrijen samengevoegd tot twee uitvoerrijen. Zonder deze clausule krijg je één rij per invoerrij, met voornamelijk NULL-waarden.
SELECT
region,
SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;
-- Result:
-- region | q1 | q2
-- East | 100 | 150
-- West | 200 | 250De juiste aggregatiefunctie kiezen
De aggregatiefunctie waarin je CASE plaatst, moet passen bij de vraag:
SUMwanneer elke cel waarden optelt.MAXofMINwanneer elk regio-/kwartaalpaar precies één waarde heeft en je die alleen zichtbaar wilt maken.COUNTwanneer elke cel overeenkomende rijen telt.
Interviewers vragen vaak naar de COUNT-variant: hoeveel bestellingen zijn er per status per maand?
SELECT
month,
COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped,
COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled
FROM orders
GROUP BY month;MAX voor cellen met één waarde
Wanneer elk sleutel-/categoriepaar één waarde bevat (een echte kruistabel, geen totaal), gebruik je MAX of MIN. Beide geven de enige niet-NULL-waarde terug en negeren de NULL-waarden uit niet-overeenkomende vertakkingen.
Dit is de veilige keuze wanneer je kenmerken herschikt in plaats van geld op te tellen, bijvoorbeeld wanneer je een tabel met sleutel-waarde-instellingen omzet naar één rij per entiteit.
-- Turn key/value rows into one wide row per user
SELECT
user_id,
MAX(CASE WHEN attr = 'city' THEN value END) AS city,
MAX(CASE WHEN attr = 'plan' THEN value END) AS plan
FROM user_attributes
GROUP BY user_id;NULL-waarden in uitvoercellen verwerken
Als een regio geen verkopen in Q2 had, bevat de cel q2 als resultaat NULL. Interviewers kunnen je vragen om in plaats daarvan 0 te tonen. Plaats de volledige aggregatiefunctie in COALESCE.
Gebruik COALESCE buiten de aggregatiefunctie, niet binnen CASE, zodat je alleen een vervangende waarde gebruikt wanneer de volledige groep geen overeenkomende rijen heeft.
SELECT
region,
COALESCE(SUM(CASE WHEN quarter = 'Q1' THEN amount END), 0) AS q1,
COALESCE(SUM(CASE WHEN quarter = 'Q2' THEN amount END), 0) AS q2
FROM sales
GROUP BY region;Een kolom met een eindtotaal toevoegen
Een veelgestelde vervolgvraag is om een totaal over alle gedraaide kolommen toe te voegen. Je hoeft de kolommen niet op naam op te tellen. Een gewone SUM(amount) over dezelfde groep geeft het rijtotaal, omdat deze functie de filtering van CASE volledig negeert.
Hiermee laat je de interviewer zien dat je begrijpt dat elke aggregatiefunctie in de SELECT onafhankelijk over dezelfde groep wordt berekend.
SELECT
region,
SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2,
SUM(amount) AS total
FROM sales
GROUP BY region;De verkorte notatie voor een gefilterde aggregatiefunctie
PostgreSQL en de SQL-standaard ondersteunen FILTER (WHERE ...), een overzichtelijkere manier om voorwaardelijke aggregatie te schrijven. De notatie leest beter en voorkomt de standaardcode rond CASE.
Noem dit in een sollicitatiegesprek om je brede kennis te tonen, maar weet dat MySQL en SQL Server dit niet ondersteunen. Daarom blijft CASE het overdraagbare antwoord.
-- Postgres / standard SQL
SELECT
region,
SUM(amount) FILTER (WHERE quarter = 'Q1') AS q1,
SUM(amount) FILTER (WHERE quarter = 'Q2') AS q2
FROM sales
GROUP BY region;De belangrijkste beperking
Voorwaardelijke aggregatie heeft één beperking waar interviewers op zullen doorvragen: je moet elke uitvoerkolom handmatig opsommen. Als kwartalen of categorieën niet vooraf bekend zijn, kan deze statische query zich niet aanpassen.
Dat probleem heet een dynamische draaitabel en vereist gegenereerde SQL. Voor een vaste, bekende verzameling categorieën is voorwaardelijke aggregatie echter de overzichtelijke, platformonafhankelijke winnaar.
Korte controle
Toets je begrip van het patroon voor voorwaardelijke aggregatie.
Samenvatting
Voorwaardelijke aggregatie is de platformonafhankelijke draaitabeloplossing die elke interviewer accepteert:
- Eén
CASEper uitvoerkolom, verpakt in een aggregatiefunctie. SUMvoor totalen,MAX/MINvoor cellen met één waarde,COUNTvoor aantallen.- Dit werkt omdat aggregatiefuncties de
NULL-waarde uit niet-overeenkomende vertakkingen negeren. - Gebruik
COALESCEom lege cellen in 0 te veranderen. - Beperking: kolommen moeten hardgecodeerd zijn, wat leidt tot dynamische draaitabellen in het volgende onderdeel.
Leer SQL met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “Pivots maken met conditionele aggregatie” gratis?
Ja — de volledige tekst van “Pivots maken met conditionele aggregatie” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op SQL-sollicitatiegesprekken wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.
Wat leer ik in “Pivots maken met conditionele aggregatie”?
Het draagbare patroon met CASE binnen SUM om rijen in kolommen om te zetten. Je oefent met Voorbereiding op SQL-sollicitatiegesprekken door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Voorbereiding op SQL-sollicitatiegesprekken te beginnen?
Ervaring vooraf is niet nodig. Voorbereiding op SQL-sollicitatiegesprekken op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “Pivots maken met conditionele aggregatie”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op SQL-sollicitatiegesprekken?
Ja. Elke les over Voorbereiding op SQL-sollicitatiegesprekken bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Pivots maken met conditionele aggregatie
- PIVOT- en crosstab-syntaxis per databaseleverancier
- Kolommen terugzetten naar rijen
- Dynamische pivots met onbekende kolommen