Groepen filteren met HAVING

Voltooid

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.