Фильтрация групп с помощью предложения HAVING.

Завершено

После создания групп с помощью предложения GROUP BY можно дополнительно отфильтровать результаты. Предложение HAVING действует как фильтр по группам. Это аналогично тому, что предложение WHERE действует как фильтр по строкам, которые возвращает предложение FROM.

Предложение HAVING позволяет создать условие поиска, концептуально похожее на предикат предложения WHERE, который затем проверяет каждую группу, возвращенную предложением GROUP BY.

В следующем примере выполняется подсчет заказов для каждого клиента и фильтрация результатов для включения только тех клиентов, которые разместили более 10 заказов:

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

Сравнение предложений HAVING и WHERE

Хотя предложения HAVING и WHERE фильтруют данные, помните, что WHERE работает со строками, возвращенными предложением FROM. Если раздел GROUP BY ... HAVING существует в запросе и следует за предложением WHERE, предложение WHERE будет фильтровать строки до обработки GROUP BY. Это может ограничить количество создаваемых групп.

Предложение HAVING обрабатывается после GROUP BY и работает только с группами, а не со строками детализации. Подведение итогов.

  • Предложение WHERE фильтрует строки до формирования всех групп
  • Предложение HAVING фильтрует группы целиком и обычно анализирует результаты агрегирования.