Предложение GROUP BY SQL Server

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

Введение в предложение GROUP BY SQL Server

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

Ниже показан синтаксис предложения GROUP BY:

SELECT
    select_list
FROM
    table_name
GROUP BY
    column_name1,
    column_name2 ,...;

В этом запросе предложение GROUP BY создает группу для каждой комбинации значений в столбцах, перечисленных в предложении GROUP BY.

Рассмотрим следующий пример:

SELECT
    customer_id,
    YEAR(order_date) order_year
FROM
    sales.orders
WHERE
    customer_id IN(1, 2)
ORDER BY
    customer_id;

Предложение GROUP BY SQL Server

В этом примере мы извлекаем идентификатор клиента и заказанный год для клиентов с идентификаторами клиента 1 и 2.

Выходные данные показывают, что клиент с идентификатором 1 разместил один заказ в 2016 году и два заказа в 2018 году. Клиент с идентификатором 2 разместил два заказа в 2017 году и один заказ в 2018 году.

Давайте добавим в запрос предложение GROUP BY, чтобы увидеть эффект:

SELECT
    customer_id,
    YEAR(order_date) order_year
FROM
    sales.orders
WHERE
    customer_id IN(1, 2)
GROUP BY
    customer_id,
    YEAR(order_date)
ORDER BY
    customer_id;

Пример предложения GROUP BY в SQL Server

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

С функциональной точки зрения предложение GROUP BY в приведенном выше запросе дало тот же результат, что и следующий запрос, использующий предложение DISTINCT :

SELECT DISTINCT
    customer_id,
    YEAR(order_date) order_year
FROM
    sales.orders
WHERE
    customer_id IN(1, 2)
ORDER BY
    customer_id;

SQL Server GROUP BY - DISTINCT example

Предложение GROUP BY SQL Server и агрегатные функции

На практике предложение GROUP BY часто используется с агрегатными функциями для создания сводных отчетов.

Агрегатная функция выполняет расчет для группы и возвращает уникальное значение для каждой группы. Например, COUNT() возвращает количество строк в каждой группе. Другие часто используемые агрегатные функции: SUM(), AVG()(среднее), MIN()(минимум), MAX()(максимум).

Предложение GROUP BY объединяет строки в группы, а агрегатная функция возвращает сводку(количество, минимум, максимум, среднее значение, сумму и т. д.) для каждой группы.

Например, следующий запрос возвращает количество заказов, размещенных клиентом по годам:

SELECT
    customer_id,
    YEAR(order_date) order_year,
    COUNT(order_id) order_placed
FROM
    sales.orders
WHERE
    customer_id IN(1, 2)
GROUP BY
    customer_id,
    YEAR(order_date)
ORDER BY
    customer_id; 

Предложение GROUP BY SQL Server — пример выражения

Если вы хотите сослаться на столбец или выражение, которые не перечислены в предложении GROUP BY, вы должны использовать этот столбец в качестве входных данных агрегатной функции. В противном случае вы получите ошибку, поскольку нет гарантии, что столбец или выражение вернет единственное значение для каждой группы. Например, следующий запрос не будет выполнен:

SELECT
    customer_id,
    YEAR(order_date) order_year,
    order_status
FROM
    sales.orders
WHERE
    customer_id IN(1, 2)
GROUP BY
    customer_id,
    YEAR(order_date)
ORDER BY
    customer_id;

Больше примеров предложения GROUP BY

Давайте рассмотрим еще несколько примеров, чтобы понять, как работает предложение GROUP BY.

1) Пример использования предложения GROUP BY с функцией COUNT()

Следующий запрос возвращает количество клиентов в каждом городе:

SELECT
    city,
    COUNT(customer_id) customer_count
FROM
    sales.customers
GROUP BY
    city
ORDER BY
    city;

Пример SQL Server GROUP BY - COUNT

В этом примере предложение GROUP BY группирует клиентов по городу, а функция COUNT() возвращает количество клиентов в каждом городе.

Аналогично следующий запрос возвращает количество клиентов по штату и городу.

SELECT
    city,
    state,
    COUNT(customer_id) customer_count
FROM
    sales.customers
GROUP BY
    state,
    city
ORDER BY
    city,
    state;

Предложение GROUP BY SQL Server — пример с несколькими столбцами

2) Пример использования предложения GROUP BY с функциями MIN и MAX

Следующий оператор возвращает минимальные и максимальные цены всех продуктов модели 2018 года по брендам:

SELECT
    brand_name,
    MIN(list_price) min_price,
    MAX(list_price) max_price
FROM
    production.products p
INNER JOIN production.brands b ON b.brand_id = p.brand_id
WHERE
    model_year = 2018
GROUP BY
    brand_name
ORDER BY
    brand_name;

SQL Server GROUP BY - пример MIN и MAX

В этом примере предложение WHERE обрабатывается перед предложением GROUP BY, как всегда.

3) Пример использования предложения GROUP BY с функцией AVG()

В следующем операторе используется функция AVG() для возврата средней цены по марке для всех продуктов модельного ряда 2018 года:

SELECT
    brand_name,
    AVG(list_price) avg_price
FROM
    production.products p
INNER JOIN production.brands b ON b.brand_id = p.brand_id
WHERE
    model_year = 2018
GROUP BY
    brand_name
ORDER BY
    brand_name;

SQL Server GROUP BY - пример AVG

4) Пример использования предложения GROUP BY с функцией SUM

См. следующую таблицу order_items:

заказ_элементов

Следующий запрос использует функцию SUM() для получения чистой стоимости каждого заказа:

SELECT
    order_id,
    SUM(
        quantity * list_price *(1 - discount)
    ) net_value
FROM
    sales.order_items
GROUP BY
    order_id;

Пример SQL Server GROUP BY - SUM

Краткое содержание

  • Используйте предложение SQL Server GROUP BY для упорядочивания строк в группы по указанному списку столбцов.
Мирослав С.

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