Groepen filteren met HAVING
Wanneer u groepen hebt gemaakt met een GROUP BY-component, kunt u de resultaten verder filteren. De HAVING-clausule fungeert als een filter op groepen. Dit is vergelijkbaar met de manier waarop de WHERE-component fungeert als een filter op rijen die worden geretourneerd door de FROM-component.
Met een HAVING-component kunt u een zoekvoorwaarde maken, conceptueel vergelijkbaar met het predicaat van een WHERE-component, waarmee vervolgens elke groep wordt getest die wordt geretourneerd door de GROUP BY-component.
In het volgende voorbeeld worden de orders voor elke klant geteld en worden de resultaten gefilterd op alleen klanten die meer dan 10 orders hebben geplaatst:
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
Vergelijk HAVING met WHERE
Hoewel zowel HAVING- als WHERE-componenten gegevens filteren, moet u er rekening mee houden dat WHERE werkt op rijen die worden geretourneerd door de FROM-component. Als er een GROUP BY ... HAVING-sectie in uw query na een WHERE-component bestaat, zal de WHERE-component rijen filteren voordat GROUP BY wordt verwerkt, waardoor de groepen die kunnen worden gemaakt, mogelijk worden beperkt.
Een HAVING-component wordt verwerkt na GROUP BY en werkt alleen op groepen, niet op detailrijen. Samenvatten:
- Een WHERE-component filtert rijen voordat er groepen worden gevormd
- Een HAVING-component filtert hele groepen en kijkt meestal naar de resultaten van een aggregatie.