Filtrowanie grup za pomocą funkcji HAVING

Ukończone

Po utworzeniu grup za pomocą klauzuli GROUP BY można dalej filtrować wyniki. Klauzula HAVING działa jako filtr grup. Jest to podobne do sposobu, w jaki klauzula WHERE działa jako filtr wierszy zwracanych przez klauzulę FROM.

Klauzula HAVING umożliwia utworzenie warunku wyszukiwania, koncepcyjnie podobnego do predykatu klauzuli WHERE, który następnie testuje każdą grupę zwracaną przez klauzulę GROUP BY.

Poniższy przykład zlicza zamówienia dla każdego klienta i filtruje wyniki, aby uwzględnić tylko klientów, którzy składali więcej niż 10 zamówień:

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

Porównaj HAVING z WHERE

Podczas gdy klauzule HAVING i WHERE filtruje dane, pamiętaj, że funkcja WHERE działa na wierszach zwracanych przez klauzulę FROM. Jeśli w zapytaniu sekcja GROUP BY ... HAVING istnieje po klauzuli WHERE, klauzula WHERE będzie filtrować wiersze przed przetworzeniem GROUP BY, potencjalnie ograniczając grupy, które można utworzyć.

Klauzula HAVING jest przetwarzana po GROUP BY i działa tylko na grupach, a nie na szczegółowych wierszach. Podsumowanie:

  • Klauzula WHERE filtruje wiersze przed utworzeniem grup
  • Klauzula HAVING filtruje całe grupy i zwykle analizuje wyniki agregacji.