SELECT — предложение GROUP BY (Transact-SQL)

Относится к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsSQL аналитическая конечная точка в Microsoft FabricХранилище в Microsoft FabricSQL база данных в Microsoft Fabric

Предложение SELECT инструкции, разделяющее результат запроса на группы строк, обычно путем выполнения одной или нескольких агрегатов для каждой группы. Инструкция SELECT возвращает одну строку для каждой группы.

В этой статье приведены различные синтаксисы, аргументы, замечания, разрешения и примеры на основе выбранной версии продукта. Выберите нужную версию продукта из раскрывающегося списка версий.

Syntax

Соглашения о синтаксисе Transact-SQL

Синтаксис, совместимый с ISO, для SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database in Fabric:

GROUP BY {
      column-expression
    | ROLLUP ( <group_by_expression> [ , ...n ] )
    | CUBE ( <group_by_expression> [ , ...n ] )
    | GROUPING SETS ( <grouping_set> [ , ...n ]  )
    | () --calculates the grand total
} [ , ...n ]

<group_by_expression> ::=
      column-expression
    | ( column-expression [ , ...n ] )

<grouping_set> ::=
      () --calculates the grand total
    | <grouping_set_item>
    | ( <grouping_set_item> [ , ...n ] )

<grouping_set_item> ::=
      <group_by_expression>
    | ROLLUP ( <group_by_expression> [ , ...n ] )
    | CUBE ( <group_by_expression> [ , ...n ] )

Синтаксис, не совместимый с ISO, только для обратной совместимости:

GROUP BY {
       ALL column-expression [ , ...n ]
    | column-expression [ , ...n ]  WITH { CUBE | ROLLUP }
       }

Синтаксис Для Azure Synapse Analytics:

GROUP BY {
      column-name [ WITH (DISTRIBUTED_AGG) ]
    | column-expression
    | ROLLUP ( <group_by_expression> [ , ...n ] )
} [ , ...n ]

Синтаксис для Fabric Data Warehouse и SQL аналитики:

      ALL
     | {
           column-expression
         | ROLLUP ( <group_by_expression> [ , ...n ] )
         | CUBE ( <group_by_expression> [ , ...n ] )
         | GROUPING SETS ( <grouping_set> [ , ...n ]  )
         | () --calculates the grand total
       } [ , ...n ]

<group_by_expression> ::=
      column-expression
    | ( column-expression [ , ...n ] )

<grouping_set> ::=
      () --calculates the grand total
    | <grouping_set_item>
    | ( <grouping_set_item> [ , ...n ] )

<grouping_set_item> ::=
      <group_by_expression>
    | ROLLUP ( <group_by_expression> [ , ...n ] )
    | CUBE ( <group_by_expression> [ , ...n ] )

Arguments

column-expression

Указывает столбец или вычисление, отличное от агрегирования, в столбце. Этот столбец может принадлежать таблице, производной таблице или представлению. Столбец должен отображаться в FROM предложении инструкции SELECT , но не нужно отображаться в списке SELECT .

Допустимые выражения см. в разделе expression.

Столбец должен отображаться в FROM предложении инструкции SELECT , но не требуется отображаться в списке SELECT . Однако необходимо включить каждую таблицу или столбец представления в GROUP BY список, если он используется в любом выражении, отличном от агрегирования, в списке <select> .

Параметры GROUP BY

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

  • ROLLUP ( <group_by_expression> [ , ... n ] )

    Создает иерархические промежуточные итоги для перечисленных столбцов и итоговую общую сумму (например, , (a,b,c), (a,b)(a)). () Используйте его для детализации отчетов,таких как >месяц года>.

  • CUBE ( <group_by_expression> [ , ... n ] )

    Создает все сочетания указанных столбцов (полный 2^n латтис) плюс общий итог. Используйте его для многомерного анализа по каждому срезу.

  • ГРУППИРОВАНИЕ НАБОРОВ ( <grouping_set> [ , ... n ] )

    Определяет точные группировки для вычислений (включая () общий итог) в одном проходе. Этот параметр функционально похож на UNION ALL несколько GROUP BY запросов, но оптимизирован вместе.

  • () (пустой набор группирования)

    Сокращенно для вычислений только большого общего числа во всех строках. Используйте его только как GROUP BY () или внутри GROUPING SETS.

  • ALL column-expression [ , ... n ](non-ISO; обратная совместимость)

    Сокращенная группа по всем негрегрегатным элементам выбора. Сохранено для обеспечения совместимости; доступность и семантика зависят.

  • column-expression [ , ... n ] WITH { CUBE | 'ROLLUP }(устаревшая форма)

    Старый синтаксис, отличный от GROUP BY CUBE(...) ISO, эквивалентный или GROUP BY ROLLUP(...). Поддерживается только для обеспечения обратной совместимости. По возможности используйте подклаузы ISO.

  • С (DISTRIBUTED_AGG)

    Указывает распределенное выполнение для агрегирования при группировке по одному столбцу. Только выделенные SQL-пулы Azure Synapse Analytics поддерживают эту опцию.

ВЫРАЖЕНИЕ СТОЛБЦА GROUP BY [ ,... n ]

SELECT Группирует результаты инструкции в соответствии со значениями в списке одного или нескольких выражений столбцов.

Например, этот запрос создает таблицу Sales со столбцами для Region, Territoryа также Sales. Она вставляет четыре строки, а две строки имеют соответствующие значения для Region и Territory.

CREATE TABLE Sales
(
    Region VARCHAR (50),
    Territory VARCHAR (50),
    Sales INT
);
GO

INSERT INTO Sales VALUES (N'Canada', N'Alberta', 100);
INSERT INTO Sales VALUES (N'Canada', N'British Columbia', 200);
INSERT INTO Sales VALUES (N'Canada', N'British Columbia', 300);
INSERT INTO Sales VALUES (N'United States', N'Montana', 100);

Таблица Sales содержит следующие строки:

Region Территория Sales
Canada Alberta 100
Canada Британская Колумбия 200
Canada Британская Колумбия 300
США Montana 100

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

SELECT Region,
       Territory,
       SUM(sales) AS TotalSales
FROM Sales
GROUP BY Region, Territory;

Результат запроса имеет три строки, так как существует три сочетания значений для Region и Territory. Для TotalSales Канады и Британской Колумбии сумма двух строк.

Region Территория TotalSales
Canada Alberta 100
Canada Британская Колумбия 500
США Montana 100

Выражение столбца в GROUP BY не может содержать следующие элементы:

  • GROUP BY Выражение столбца не может содержать псевдоним столбца, который вы определили в SELECT списке. Он может использовать псевдоним столбца для производной таблицы, определенной в предложении FROM .
  • GROUP BY Выражение столбца не может содержать столбец с текстом, ntext или изображением. Однако можно использовать столбец текста, ntext или изображения в качестве аргумента функции, возвращающей значение допустимого типа данных. Например, выражение может использовать SUBSTRING() и CAST(). Это правило также относится к выражениям в предложении HAVING .
  • GROUP BY Столбцовое выражение не может содержать метод типа данных в xml. Он может включать пользовательскую функцию или вычисленный столбц, использующий методы XML-типов данных.
  • Столбцовое GROUP BY выражение не может содержать подзапрос; запрос возвращает ошибку 144.
  • GROUP BY Выражение столбца не может содержать столбец из индексированного вида.

Следующие инструкции являются допустимыми.

SELECT ColumnA,
       ColumnB
FROM T
GROUP BY ColumnA, ColumnB;

SELECT ColumnA + ColumnB
FROM T
GROUP BY ColumnA, ColumnB;

SELECT ColumnA + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;

SELECT ColumnA + ColumnB + constant
FROM T
GROUP BY ColumnA, ColumnB;

Следующие инструкции не допускаются.

SELECT ColumnA,
       ColumnB
FROM T
GROUP BY ColumnA + ColumnB;

SELECT ColumnA + constant + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;

ГРУППИРОВКА ПО ВСЕМ

Относится к: Fabric Data Warehouse и SQL-аналитике endpoint

Группирует строки в запросе по всем неагрегированным выражениям списка SELECT , не требуя явного перечисления их в предложении GROUP BY <columns> .

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

Этот GROUP BY ALL синтаксис применяется только к Fabric Data Warehouse и к конечной точке аналитики SQL. Этот GROUP BY ALL синтаксис в настоящее время недоступен в SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure или SQL Database in Fabric. Для этих платформ используйте синтаксис выражения столбцов GROUP BY ALL.

  • GROUP BY ALL определяет все выражения в SELECT списке.
  • GROUP BY ALL исключает выражения, обёрнутые агрегированными функциями.
  • GROUP BY ALL группы по всем оставшимся выражениям.
  • GROUP BY ALL не меняет семантику запросов — только синтаксис. Добавление нового неагрегированного столбца в SELECT список автоматически влияет на группировку.

В отличие от явной GROUP BY <columns> клаузы, которая вызывает ошибку, если выбранный столбец не включён в ключи группировки, GROUP BY ALL автоматически добавляет все неагрегированные столбцы из SELECT списка в набор группировки. Такой подход позволяет избежать ошибки Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause .

Предупреждение

Добавление большого количества столбцов в набор группировки может негативно сказаться на производительности запросов.

Если вам нужен точный контроль над группировкой ключей, используйте явное GROUP BY <columns> предложение и проецируйте дополнительные неагрегированные столбцы, применяя легкую функцию агрегата, например ANY_VALUE.

Следующий пример демонстрирует, как использовать GROUP BY ALL тот же набор данных, что и примеры GROUP BY <columns> , чтобы упростить сравнение поведения и результатов.

SELECT
    Region,
    Territory,
    SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ALL;

GROUP BY ALL неявно группирует по Region и Territory потому, что это единственные неагрегированные выражения в SELECT списке.

Результат запроса имеет три строки, так как существует три сочетания значений для Region и Territory. Для TotalSales Канады и Британской Колумбии сумма двух строк.

Region Территория TotalSales
Canada Alberta 100
Canada Британская Колумбия 500
США Montana 100

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

ГРУППА ПО СВЕРТКЕ ()

Создает группу для каждого сочетания выражений столбцов. Кроме того, он свернул результаты в промежуточные итоги и большие итоги. При создании групп он перемещается справа налево, уменьшая количество выражений столбцов для группировки и агрегирования.

Порядок столбцов влияет на ROLLUP выходные данные и может повлиять на количество строк в результирующем наборе.

Например, GROUP BY ROLLUP (col1, col2, col3, col4) создает группы для каждого сочетания выражений столбцов в следующих списках:

  • COL1, COL2, COL3, COL4
  • col1, col2, col3, NULL
  • col1, col2, NULL, NULL
  • col1, NULL, NULL, NULL, NULL
  • NULL, NULL, NULL, NULL (группа со NULL значениями — это общий итог)

Используя таблицу из предыдущего примера, этот код выполняет GROUP BY ROLLUP операцию вместо базовой GROUP BY.

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory);

Результат запроса имеет те же агрегаты, что и базовый GROUP BY без ROLLUP. Кроме того, он создает промежуточные итоги для каждого значения региона. Наконец, выводится общий итог для всех строк. Результат выглядит следующим образом.

Region Территория TotalSales
Canada Alberta 100
Canada Британская Колумбия 500
Canada NULL 600
США Montana 100
США NULL 100
NULL NULL 700

ГРУППА ПО КУБУ ()

GROUP BY CUBE создает группы для всех возможных сочетаний столбцов. Для GROUP BY CUBE (a, b)результатов имеются группы для уникальных значений (a, b), (NULL, b)и (a, NULL)(NULL, NULL).

Используя таблицу из предыдущих примеров, этот код выполняет GROUP BY CUBE операцию в регионе и территории.

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);

Результат запроса содержит группы для уникальных значений (Region, Territory), (NULL, Territory)(Region, NULL)а (NULL, NULL)также . Результат выглядит следующим образом:

Region Территория TotalSales
Canada Alberta 100
NULL Alberta 100
Canada Британская Колумбия 500
NULL Британская Колумбия 500
США Montana 100
NULL Montana 100
NULL NULL 700
Canada NULL 600
США NULL 100

ГРУППИРОВАТЬ ПО ГРУППИРОВКАМ МНОЖЕСТВ ()

Параметр GROUPING SETS объединяет несколько GROUP BY предложений в одно GROUP BY предложение. Результаты совпадают с использованием UNION ALL указанных групп.

Например, GROUP BY ROLLUP (Region, Territory) и GROUP BY GROUPING SETS ( ROLLUP (Region, Territory)) возвращают одинаковые результаты.

При GROUPING SETS наличии двух или более элементов результаты являются объединением элементов. В этом примере возвращается объединение ROLLUP и CUBE результаты для региона и территории.

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(ROLLUP(Region, Territory), CUBE(Region, Territory));

Результаты совпадают с этим запросом, который возвращает объединение двух GROUP BY операторов.

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory)
UNION ALL
SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);

SQL не объединяет повторяющиеся группы, созданные GROUPING SETS для списка. Например, в GROUP BY ((), CUBE (Region, Territory))обоих элементах возвращается строка для большого итога, а обе строки отображаются в результатах.

Поддержка функций ISO и ANSI SQL-2006 GROUP BY

Предложение GROUP BY поддерживает все GROUP BY функции, включенные в стандарт SQL-2006 со следующими исключениями синтаксиса:

  • Группирование наборов не допускается в GROUP BY предложении, если они не являются частью явного GROUPING SETS списка. Например, GROUP BY Column1, (Column2, ...ColumnN) допускается в стандарте, но не в Transact-SQL. Transact-SQL поддерживает GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) и GROUP BY Column1, Column2, ... ColumnN, которые семантически эквивалентны. Эти предложения семантически эквивалентны предыдущему GROUP BY примеру. Это ограничение позволяет избежать возможности, которая GROUP BY Column1, (Column2, ...ColumnN) может быть неправильно интерпретирована как GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), которая не является семантически эквивалентной.

  • Группирование наборов не допускается внутри группирования наборов. Например, предложение GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn)) допускается в стандарте SQL-2006, но не в Transact-SQL. Transact-SQL допускает GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn) или GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn))семантически эквивалентно первому GROUP BY примеру и имеет более четкий синтаксис.

ГРУППА ПО ()

Указывает пустую группу, которая создает общий итог. Эта группа полезна в качестве одного из элементов GROUPING SET. Например, это заявление дает общий объем продаж для каждого региона, а затем дает общий итог для всех регионов.

SELECT Region,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(Region, ());

ВЫРАЖЕНИЕ СТОЛБЦА GROUP BY ALL [ ,... n ]

Применяется к: SQL Server, Azure SQL SQL Database, Управляемый экземпляр SQL Azure и SQL Database in Fabric

Note

Используйте этот синтаксис только для обратной совместимости. Избегайте использования этого синтаксиса в новых разработках и учитывайте необходимость изменения в будущем приложений, использующих этот синтаксис сейчас.

GROUP BY ALL Синтаксис T-SQL отличается в Fabric Data Warehouse. Для Fabric Data Warehouse версии этой статьи см. SELECT - GROUP BY для Fabric Data Warehouse.

Указывает, следует ли включать все группы в результаты независимо от того, соответствуют ли они критериям поиска в предложении WHERE . Группы, которые не соответствуют критериям поиска, имеют NULL агрегирование.

  • GROUP BY ALL {columns} не поддерживается в запросах, которые обращаются к удалёным таблицам, если в запросе также WHERE есть оговорка.
  • GROUP BY ALL {columns} не работает на столбцах, имеющих атрибут FILESTREAM.

Поддержка функций ISO и ANSI SQL-2006 GROUP BY

Предложение GROUP BY поддерживает все GROUP BY функции, включенные в стандарт SQL-2006 со следующими исключениями синтаксиса:

  • Вы можете использовать GROUP BY ALL только базовое GROUP BY DISTINCT предложение, GROUP BY содержащее выражения столбцов. Их нельзя использовать с GROUPING SETSконструкциями , или ROLLUPCUBEWITH CUBEWITH ROLLUP конструкторами. ALL значение по умолчанию и неявно. Его можно использовать только в синтаксисе с обратной совместимостью.

ВЫРАЖЕНИЕ СТОЛБЦА GROUP BY [ ,... n ] WITH { CUBE | ROLLUP }

Применяется к: SQL Server, Azure SQL SQL Database, Управляемый экземпляр SQL Azure и SQL Database in Fabric

Наследие GROUP BY <column-expression> WITH CUBE и GROUP BY <column-expression> WITH ROLLUP синтаксис поддерживаются только для обратной совместимости.

Note

Используйте этот синтаксис только для обратной совместимости. Избегайте использования этого синтаксиса в новых разработках и учитывайте необходимость изменения в будущем приложений, использующих этот синтаксис сейчас.

С (DISTRIBUTED_AGG)

Применимо к: Azure Synapse Analytics

DISTRIBUTED_AGG Подсказка запроса не поддерживается в SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure, SQL базе данных в Fabric или Fabric Data Warehouse.

Указание DISTRIBUTED_AGG запроса заставляет систему массово параллельной обработки (MPP) распространять таблицу в определенном столбце перед выполнением агрегирования. Указание запроса можно использовать DISTRIBUTED_AGG только для одного столбца в предложении GROUP BY . После завершения запроса перераспределенная таблица удаляется. Исходная таблица не изменяется.

Note

DISTRIBUTED_AGG Подсказка по запросу обеспечивает обратную совместимость и не улучшает производительность для большинства запросов. По умолчанию MPP уже перераспределяет данные для улучшения производительности для статистических вычислений.

Замечания

Взаимодействие GROUP BY с инструкцией SELECT

SELECT Список:

  • Векторные агрегаты. Если в SELECT список включены агрегатные функции, GROUP BY вычисляется сводное значение для каждой группы. Эти функции называются агрегатами векторов.
  • Чёткие агрегаты. Агрегаты AVG(DISTINCT <column_name>), COUNT(DISTINCT <column_name>)а также SUM(DISTINCT <column_name>) работа с ROLLUP, CUBEа также GROUPING SETS.

Предложение WHERE:

  • SQL удаляет строки, которые не соответствуют условиям в WHERE предложении перед выполнением каких-либо операций группировки.

Предложение HAVING:

  • SQL использует HAVING предложение для фильтрации групп в результирующем наборе.

Предложение ORDER BY:

  • ORDER BY Используйте предложение, чтобы упорядочить результирующий набор. Предложение GROUP BY не упорядочиет результирующий набор.

NULL Значения:

  • Если столбец группировки содержит NULL значения, ядро СУБД обрабатывает все NULL значения как равные и собирает их в одну группу.

Ограничения

Область применения: SQL Server и Azure Synapse Analytics

GROUP BY Для предложения, использующего ROLLUP(CUBEилиGROUPING SETS) максимальное число выражений, равное 32. Максимальное число групп — 4096 (212). В следующих примерах происходит сбой, так как предложение GROUP BY содержит более 4096 групп.

  • Следующий пример создает наборы группирования 4097 (212 + 1), а затем завершается сбоем.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b)
    
  • В следующем примере создается 4097 (212 + 1) групп, а затем завершается сбоем. Оба CUBE ()() набора группирования создают большую общую строку и повторяющиеся наборы группирования не устраняются.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())
    
  • В этом примере используется синтаксис с обратной совместимостью. Он создает наборы группирования 8 192 (213), а затем завершается сбоем.

    GROUP BY CUBE (a1, ..., a13)
    GROUP BY a1, ..., a13 WITH CUBE
    

    Для предложений с обратной совместимостью, которые не содержат GROUP BY или CUBEROLLUP, размеры столбцов, агрегированные GROUP BY столбцы и статистические значения, участвующие в запросе, ограничивают количество GROUP BY элементов. Это ограничение исходит от ограничения в 8 060 байтов промежуточной рабочей области, содержащей промежуточные результаты запроса. Можно использовать не более 12 выражений группировки при указании CUBE или ROLLUP.

Сравнение поддерживаемых функций GROUP BY

В следующей таблице описываются GROUP BY функции, которые поддерживают различные продукты.

Feature SQL Server Integration Services SQL Server 1
DISTINCT Агрегатов Не поддерживается для WITH CUBE или WITH ROLLUP. Поддерживается для WITH CUBE, , WITH ROLLUP, GROUPING SETSCUBEили ROLLUP.
Определяемая пользователем функция с CUBE именем или ROLLUP именем в предложении GROUP BY Определяемая пользователем функция dbo.cube(<arg1>, ...<argN>) или dbo.rollup(<arg1>, ...<argN>) в предложении GROUP BY разрешена.

Например: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
Определяемая пользователем функция dbo.cube (<arg1>, ...<argN>) или dbo.rollup(<arg1>, ...<argN>) в предложении GROUP BY не разрешена.

Например: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);

SQL Server возвращает сообщение об ошибке 2.

Чтобы избежать этой проблемы, замените конструкцию dbo.cube на [dbo].[cube] или конструкцию dbo.rollup на [dbo].[rollup].

Следующий пример является допустимым: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y);.
GROUPING SETS Не поддерживается Supported
CUBE Не поддерживается Supported
ROLLUP Не поддерживается Supported
Общий итог, например GROUP BY() Не поддерживается Supported
GROUPING_ID функция Не поддерживается Supported
GROUPING функция Supported Supported
WITH CUBE Supported Supported
WITH ROLLUP Supported Supported
WITH CUBE или WITH ROLLUP "дубликат" удаление группирования Supported Supported

1Уровень совместимости базы данных 100 и выше.

2 Возвращается сообщение об ошибке: Incorrect syntax near the keyword 'cube'|'rollup'.

Examples

Образцы кода в этой статье используют AdventureWorks2025, AdventureWorksDW2025или AdventureWorksLT2025 примерную базу данных, которую можно скачать из репозитория GitHub Azure Data Data SQL Samples Repository (Сэмпл SQL).

A. Использование базового предложения GROUP BY

В следующем примере извлекается сумма для каждого SalesOrderID из таблицы SalesOrderDetail. В примере используется база данных AdventureWorks.

SELECT SalesOrderID,
       SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail AS sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID;

B. Использование предложения GROUP BY с несколькими таблицами

В следующем примере из таблицы City, соединенной с таблицей Address, получается количество работников для каждого города EmployeeAddress. В примере используется база данных AdventureWorks.

SELECT a.City,
       COUNT(bea.AddressID) AS EmployeeCount
FROM Person.BusinessEntityAddress AS bea
     INNER JOIN Person.Address AS a
         ON bea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City;

C. Использование предложения GROUP BY в выражениях

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

SELECT DATEPART(yyyy, OrderDate) AS N'Year',
       SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy, OrderDate)
ORDER BY DATEPART(yyyy, OrderDate);

D. Использование предложения GROUP BY с предложением HAVING

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

SELECT DATEPART(yyyy, OrderDate) AS N'Year',
       SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy, OrderDate)
HAVING DATEPART(yyyy, OrderDate) >= N'2003'
ORDER BY DATEPART(yyyy, OrderDate);

Примеры: Azure Synapse Analytics

E. Базовое использование предложения GROUP BY

В следующем примере вычисляется общий объем всех продаж за каждый день. Запрос возвращает одну строку, содержащую сумму всех продаж за каждый день.

-- Uses AdventureWorksDW
SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;

F. Базовое использование указания DISTRIBUTED_AGG

В этом примере используется указание запроса DISTRIBUTED_AGG для принудительного перетасовки таблицы в CustomerKey столбце перед выполнением агрегирования.

-- Uses AdventureWorksDW
SELECT CustomerKey,
       SUM(SalesAmount) AS sas
FROM FactInternetSales
GROUP BY CustomerKey WITH(DISTRIBUTED_AGG)
ORDER BY CustomerKey DESC;

G. Варианты синтаксиса для GROUP BY

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

-- Uses AdventureWorks
SELECT LastName,
       FirstName
FROM DimCustomer
GROUP BY LastName, FirstName;

SELECT NumberCarsOwned
FROM DimCustomer
GROUP BY YearlyIncome, NumberCarsOwned;

SELECT (SalesAmount + TaxAmt + Freight) AS TotalCost
FROM FactInternetSales
GROUP BY SalesAmount, TaxAmt, Freight;

SELECT SalesAmount,
       SalesAmount * 1.10 AS SalesTax
FROM FactInternetSales
GROUP BY SalesAmount;

SELECT SalesAmount
FROM FactInternetSales
GROUP BY SalesAmount, SalesAmount * 1.10;

H. Использование предложения GROUP BY с несколькими выражениями GROUP BY

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

-- Uses AdventureWorks
SELECT OrderDateKey,
       DueDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, DueDateKey
ORDER BY OrderDateKey;

I. Использование предложения GROUP BY с предложением HAVING

В следующем примере используется предложение HAVING, чтобы указать, какие группы, сформированные в предложении GROUP BY, должны быть включены в результирующий набор. В результаты включаются только группы с датами заказа в 2004 году или более поздней версии.

-- Uses AdventureWorks
SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20040000
ORDER BY OrderDateKey;