В этом руководстве вы узнаете, как использовать предложение SQL Server GROUP BY для группировки строк по одному или нескольким столбцам.
- Введение в предложение GROUP BY SQL Server
- Предложение GROUP BY SQL Server и агрегатные функции
- Больше примеров предложения GROUP BY
- 1) Пример использования предложения GROUP BY с функцией COUNT()
- 2) Пример использования предложения GROUP BY с функциями MIN и MAX
- 3) Пример использования предложения GROUP BY с функцией AVG()
- 4) Пример использования предложения GROUP BY с функцией SUM
- Краткое содержание
Введение в предложение 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;

В этом примере мы извлекаем идентификатор клиента и заказанный год для клиентов с идентификаторами клиента 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 объединило первые три строки в две группы, а следующие три строки — в две другие группы с уникальными комбинациями идентификатора клиента и года заказа.
С функциональной точки зрения предложение 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;
Предложение 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, вы должны использовать этот столбец в качестве входных данных агрегатной функции. В противном случае вы получите ошибку, поскольку нет гарантии, что столбец или выражение вернет единственное значение для каждой группы. Например, следующий запрос не будет выполнен:
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;

В этом примере предложение GROUP BY группирует клиентов по городу, а функция COUNT() возвращает количество клиентов в каждом городе.
Аналогично следующий запрос возвращает количество клиентов по штату и городу.
SELECT
city,
state,
COUNT(customer_id) customer_count
FROM
sales.customers
GROUP BY
state,
city
ORDER BY
city,
state;

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;

В этом примере предложение 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;

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 для упорядочивания строк в группы по указанному списку столбцов.





