Filtern von Gruppen mit HAVING

Abgeschlossen

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.