Filtern von Gruppen mit HAVING
Wenn Sie Gruppen mit einer GROUP BY-Klausel erstellt haben, können Sie die Ergebnisse weiter filtern. Die HAVING-Klausel fungiert als Filter für Gruppen. Dies ähnelt der Art und Weise, wie die WHERE-Klausel als Filter für Zeilen fungiert, die von der FROM-Klausel zurückgegeben werden.
Mit einer HAVING-Klausel können Sie eine Suchbedingung erstellen, die konzeptionell dem Prädikat einer WHERE-Klausel ähnelt, die dann jede von der GROUP BY-Klausel zurückgegebene Gruppe testet.
Das folgende Beispiel zählt die Bestellungen für jeden Kunden und filtert die Ergebnisse so, dass nur Kunden enthalten sind, die mehr als 10 Bestellungen platziert haben:
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
Vergleichen von HAVING mit WHERE
HAVING- und WHERE-Klauseln filtern zwar beide Daten, aber beachten Sie, dass WHERE auf Zeilen angewendet wird, die von der FROM-Klausel zurückgegeben werden. Wenn ein Abschnitt GROUP BY ... HAVING-Abschnitt in Ihrer Abfrage vorhanden ist, der auf eine WHERE-Klausel folgt, filtert die WHERE-Klausel Zeilen, bevor GROUP BY verarbeitet wird – und schränkt so möglicherweise die Gruppen ein, die erstellt werden können.
Eine HAVING-Klausel wird nach GROUP BY verarbeitet und wird nur auf Gruppen, nicht auf Detailzeilen angewendet. Zusammenfassung:
- Eine WHERE-Klausel filtert Zeilen, bevor Gruppen gebildet werden.
- Eine HAVING-Klausel filtert ganze Gruppen und untersucht in der Regel die Ergebnisse einer Aggregation.