Предложение HAVING SQL Server

В этом руководстве вы узнаете, как использовать предложение 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 для фильтрации групп на основе указанных условий.
Мирослав С.

Автор статей, ИБ-специалист