Groepen filteren met HAVING
Wanneer u groepen hebt gemaakt met een GROUP BY-component, kunt u de resultaten verder filteren. De HAVING-component fungeert als 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;
VERGELIJKEN 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 een GROUP BY ... DE SECTIE HAVING bestaat in uw query na een WHERE-component. De WHERE-component filtert rijen voordat GROUP BY wordt verwerkt, waardoor de groepen die kunnen worden gemaakt, worden beperkt.
Een HAVING-component wordt verwerkt na GROUP BY en werkt alleen op groepen, niet op detailrijen. Samenvatting:
- 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.