Основы SQL Server: использование оператора SQL GROUP BY

Язык запросов 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, которые были заказаны, как вы можете видеть на следующей картинке.

We get a list of all of the ProductIDs that have been ordered (Image credit: Petri/Michael Otey)

Использование 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(*).

Using SQL GROUP BY with aggregate functions (Image credit: Petri/Michael Otey)

Использование 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.

Using SQL GROUP BY with multiple columns (Image credit: Petri/Michael Otey)

Использование 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.

Результаты этого списка кода можно увидеть на следующей диаграмме:

Using SQL GROUP BY with the HAVING clause (Image credit: Petri/Michael Otey)

Использование оператора 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 долларов в порядке убывания, причем клиенты с наибольшими заказами находятся вверху списка.

Using SQL GROUP BY with the ORDER BY clause (Image credit: Petri/Michael Otey)

Как видите, с помощью оператора GROUP BY в SQL можно сделать много разных вещей. Я показал, как оператор GROUP BY может использоваться с несколькими столбцами, а также как операторы HAVING и ORDER BY могут быть добавлены для фильтрации и сортировки результатов.

Как обычно, не стесняйтесь задавать любые вопросы об операторе GROUP BY в SQL. И если вы хотите узнать больше о SQL Server, обратитесь к предыдущим статьям в моей серии SQL Server Essential.

Source:
https://petri.com/sql-group-by/