В этом руководстве вы узнаете, как использовать предложение HAVING SQL Server для фильтрации групп на основе указанных условий.
Введение в предложение HAVING SQL Server
Предложение HAVING часто используется с предложением GROUP BY для фильтрации групп на основе указанного списка условий. Ниже показан синтаксис предложения HAVING:
SELECT select_list FROM table_name GROUP BY group_list HAVING conditions;
В этом синтаксисе предложение GROUP BY суммирует строки в группы, а предложение HAVING применяет одно или несколько условий к этим группам. В результат включаются только группы, для которых условия оцениваются как TRUE. Другими словами, группы, для которых условие оценивается как FALSE или UNKNOWN, отфильтровываются.
Поскольку SQL Server обрабатывает предложение HAVING после предложения GROUP BY, вы не можете ссылаться на агрегатную функцию, указанную в списке выбора, используя псевдоним столбца. Следующий запрос не будет выполнен:
SELECT column_name1, column_name2, aggregate_function(column_name3) column_alias FROM table_name GROUP BY column_name1, column_name2 HAVING column_alias > value;
Вместо этого вам необходимо явно использовать выражение агрегатной функции в предложении HAVING следующим образом:
SELECT column_name1, column_name2, aggregate_function(column_name3) alias FROM table_name GROUP BY column_name1, column_name2 HAVING aggregate_function(column_name3) > value;
SQL Server ИМЕЕТ примеры
Давайте рассмотрим несколько примеров, чтобы понять, как работает предложение HAVING.
SQL Server HAVING с примером функции COUNT
См. следующую таблицу заказов из образца базы данных :
В следующем операторе используется предложение HAVING для поиска клиентов, которые разместили не менее двух заказов в год:
SELECT customer_id, YEAR(order_date), COUNT(order_id) order_count FROM sales.orders GROUP BY customer_id, YEAR(order_date) HAVING COUNT(order_id) >= 2 ORDER BY customer_id;
В этом примере:
- Во-первых, предложение GROUP BY группирует заказы на продажу по клиенту и году заказа. Функция COUNT() возвращает количество заказов, которые каждый клиент размещает каждый год.
- Во-вторых, предложение HAVING отфильтровало всех клиентов, количество заказов которых меньше двух.
Пример предложения HAVING SQL Server с функцией SUM()
Рассмотрим следующую таблицу order_items:
Следующий оператор находит заказы на продажу, чистая стоимость которых превышает 20 000:
SELECT order_id, SUM( quantity * list_price *(1 - discount) ) net_value FROM sales.order_items GROUP BY order_id HAVING SUM( quantity * list_price *(1 - discount) ) > 20000 ORDER BY net_value;
В этом примере:
- Во-первых, функция SUM() возвращает чистую стоимость заказов на продажу.
- Во-вторых, предложение HAVING отфильтровывает заказы на продажу, чистая стоимость которых меньше или равна 20 000.
Пример предложения HAVING SQL Server с функциями MAX и MIN
См. следующую таблицу продуктов:
Следующий оператор сначала находит максимальную и минимальную цену в каждой категории продуктов. Затем он отфильтровывает категорию, у которой максимальная цена больше 4000 или минимальная цена меньше 500:
SELECT category_id, MAX(list_price) max_list_price, MIN(list_price) min_list_price FROM production.products GROUP BY category_id HAVING MAX(list_price) > 4000 OR MIN(list_price) < 500;
Пример предложения HAVING SQL Server с функцией AVG()
Следующее выражение находит категории продуктов, средняя цена которых составляет от 500 до 1000:
SELECT category_id, AVG(list_price) avg_list_price FROM production.products GROUP BY category_id HAVING AVG(list_price) BETWEEN 500 AND 1000;
Краткое содержание
- Используйте предложение HAVING SQL Server для фильтрации групп на основе указанных условий.