Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Относится к:SQL Server
База данных SQL Azure
Управляемый экземпляр SQL Azure
Azure Synapse Analytics
SQL аналитическая конечная точка в Microsoft Fabric
Хранилище в Microsoft Fabric
SQL база данных в 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;