Язык запросов T-SQL сервера SQL имеет множество вариантов извлечения данных. Это включает возможность запроса SQL-базы данных, а также предоставление функции суммирования, агрегатной функции подсчета и группировки столбцов. Клауза SQL GROUP BY может использовать все эти возможности. В этой статье я покажу вам, как клауза GROUP BY может использоваться сама по себе или в сочетании с одной из агрегатных функций для выполнения вычислений на основе группировки.
Как работает клауза SQL GROUP BY?
Клауза SQL GROUP BY используется с оператором SELECT для упорядочивания данных в группы одинаковых данных. Она следует за клаузой WHERE в операторе SELECT.
Эта клауза чаще всего используется с агрегатными функциями, такими как SUM, COUNT, AVG, MAX или MIN, которые позволяют выполнять вычисления с сгруппированными данными. Вы можете группировать данные по любому из различных типов столбцов, включая числа, такие как идентификаторы продуктов, даты или символы, такие как описания.
Синтаксис базовой GROUP BY довольно прост:
SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1;
Здесь вы можете увидеть использование оператора GROUP BY с простым оператором SELECT. Оператор SELECT извлекает два столбца, и второй столбец использует функцию агрегации.
Использование функции агрегации технически не обязательно, но это очень распространенный дополнительный элемент оператора GROUP BY. Группировка будет выполнена на основе данных, содержащихся в первом столбце.
Давайте поглубже изучим работу оператора GROUP BY.
Использование SQL GROUP BY с оператором SELECT
Сначала давайте посмотрим на использование оператора SQL GROUP BY с простым оператором SELECT без добавления функции агрегации. В следующем примере извлекается и группируется столбец ‘Product ID’ из таблицы SalesLT.SalesOrderDetail в образце базы данных AdventureWorksLT2019.
USE AdventureWorksLT2019; SELECT ProductID FROM SalesLT.SalesOrderDetail GROUP BY ProductID;
Это фактически возвращает список всех ProductID, которые были заказаны, как вы можете видеть на следующей картинке.

Использование GROUP BY SQL с агрегатными функциями
Это более распространено использовать оператор SQL GROUP BY вместе с одной из агрегирующих функций, которая может дать вам количество, общее значение, среднее или сводку всех столбцов, которые вы сгруппировали вместе. В следующем операторе используется GROUP BY с таблицей SalesLT.Product из базы данных AdventureWorksLT2019, чтобы найти общее количество продуктов в каждой категории продуктов:
USE AdventureWorksLT2019; SELECT ProductCategoryID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID;
В этом примере оператор SELECT возвращает столбец ‘ProductCategoryID’ из таблицы SalesLT.Product, и подсчитывает количество продуктов в каждой категории, используя агрегирующую функцию COUNT(*). Здесь оператор GROUP BY группирует результаты по ‘ProductCategoryID’, а функция SELECT COUNT вычисляет общее количество продуктов в каждой категории продуктов. Результаты функции COUNT(*) используют псевдоним ‘TotalProducts’.
Результаты этого запроса показаны на следующей диаграмме. Этот вывод показывает общее количество продуктов в каждой категории продуктов, рассчитанное с использованием оператора GROUP BY. Сводная информация возвращается агрегирующей функцией COUNT(*).

Использование SQL GROUP BY с несколькими столбцами
Функция SQL GROUP BY не ограничивается работой с одним столбцом. Ее также можно использовать сразу с несколькими столбцами в одном запросе.
Давайте рассмотрим пример использования оператора GROUP BY с двумя столбцами из таблицы SalesLT.Product в базе данных AdventureWorksLT2019. В следующем запросе показано, как извлечь общее количество продуктов для каждой категории продукта и модели продукта.
USE AdventureWorksLT2019; SELECT ProductCategoryID, ProductModelID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID, ProductModelID;
Здесь извлекаются столбцы ‘ProductCategoryID’ и ‘ProductModelID’, и используется агрегатная функция COUNT(*), чтобы посчитать количество продуктов в каждой категории продукта и подкатегории. В этом примере оператор GROUP BY группирует результаты обоих столбцов ‘ProductCategoryID’ и ‘ProductModelID’, создавая две различные группы на основе двух различных столбцов.
Результаты этого запроса можно увидеть на следующей диаграмме. Эти результаты показывают общее количество продуктов и моделей продуктов, и общее количество извлекается с использованием псевдонима столбца TotalProducts.

Использование SQL GROUP BY с оператором HAVING
Еще одно распространенное использование оператора GROUP BY – это его объединение с оператором HAVING. Действительно, можно использовать оператор GROUP BY с оператором HAVING для фильтрации результатов запроса на основе условий, которые оператор HAVING применяет к группировкам данных. Условие можно применить к обычному столбцу типа данных или к агрегатной функции.
Давайте рассмотрим пример использования оператора GROUP BY в SQL вместе с оператором HAVING с базой данных AdventureWorksLT2019. В этом примере показано, какие клиенты разместили заказы в таблице SalesLT.SalesOrderHeader на общую сумму заказа более $2000. Здесь оператор GROUP BY используется для группировки заказов по клиенту, а затем оператор HAVING фильтрует клиентов на основе общей суммы заказа.
USE AdventureWorksLT2019; SELECT c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount FROM SalesLT.Customer c JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.FirstName, c.LastName HAVING SUM(soh.TotalDue) > 2000;
- В этом списке кода таблица SalesLT.Customer объединяется с таблицей SalesLT.SalesOrderHeader по столбцу ‘CustomerID’.
- В списке SELECT извлекаются ‘CustomerID’, ‘FirstName’, ‘LastName’ и ‘TotalOrderAmount’.
- Оператор GROUP BY используется для группировки результатов по клиенту.
- Функция агрегирования SUM() вычисляет общую сумму заказа для каждого клиента.
- Оператор HAVING фильтрует сгруппированные результаты, чтобы выбрать только тех клиентов, общая сумма заказа которых превышает $2000.
Результаты этого списка кода можно увидеть на следующей диаграмме:

Использование оператора GROUP BY SQL с оператором ORDER BY
Вы также можете использовать оператор GROUP BY в SQL с оператором ORDER BY, чтобы отсортировать набор результатов по одному или нескольким столбцам. В следующем примере используется база данных AdventureWorksLT2019. Чтобы проиллюстрировать использование оператора ORDER BY с оператором GROUP BY, вы можете просто взять предыдущий пример кода и добавить оператор ORDER BY для сортировки результатов, отображающих наибольшие суммы заказов в порядке убывания.
USE AdventureWorksLT2019; SELECT c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount FROM SalesLT.Customer c JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.FirstName, c.LastName HAVING SUM(soh.TotalDue) > 2000 ORDER BY TotalOrderAmount DESC;
Результаты можно увидеть на следующей иллюстрации. Эти результаты показывают список клиентов с заказами на сумму более 2000 долларов в порядке убывания, причем клиенты с наибольшими заказами находятся вверху списка.

Как видите, с помощью оператора GROUP BY в SQL можно сделать много разных вещей. Я показал, как оператор GROUP BY может использоваться с несколькими столбцами, а также как операторы HAVING и ORDER BY могут быть добавлены для фильтрации и сортировки результатов.
Как обычно, не стесняйтесь задавать любые вопросы об операторе GROUP BY в SQL. И если вы хотите узнать больше о SQL Server, обратитесь к предыдущим статьям в моей серии SQL Server Essential.
Source:
https://petri.com/sql-group-by/