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