Фильтрация групп с помощью 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. Если в вашем запросе после предложения WHERE существует конструкция GROUP BY ... HAVING, предложение WHERE будет фильтровать строки до того, как будет обработано GROUP BY, что может потенциально ограничить создаваемые группы.
Предложение HAVING обрабатывается после GROUP BY и работает только с группами, а не строками. Подведение итогов.
- Предложение WHERE фильтрует строки перед формированием групп
- Предложение HAVING фильтрует целые группы и обычно проверяет результаты агрегирования.