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 konzeptuell dem Prädikat einer WHERE-Klausel ähnelt, das dann jede gruppe testet, die von der GROUP BY-Klausel zurückgegeben wird.

Im folgenden Beispiel werden die Bestellungen für jeden Kunden gezählt, und die Ergebnisse werden gefiltert, sodass nur Kunden berücksichtigt werden, die mehr als 10 Bestellungen aufgegeben haben.

SELECT CustomerID,
      COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;

Vergleich von HAVING mit WHERE

Während sowohl HAVING- als auch WHERE-Klauseln Daten filtern, sollten Sie beachten, dass WHERE für Zeilen verwendet wird, die von der FROM-Klausel zurückgegeben werden. Wenn ein GROUP BY ... HAVING-Abschnitt in Ihrer Abfrage existiert, die auf eine WHERE-Klausel folgt, wird die WHERE-Klausel Zeilen filtern, bevor GROUP BY verarbeitet wird – was möglicherweise die Anzahl der erstellbaren Gruppen einschränken könnte.

Eine HAVING-Klausel wird nach GROUP BY verarbeitet und funktioniert nur für Gruppen, nicht für Detailzeilen. 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.