SELECT — GROUP BY (Transact-SQL)SELECT - GROUP BY- Transact-SQL

ОБЛАСТЬ ПРИМЕНЕНИЯ:даSQL Server (начиная с 2008)даБаза данных SQL AzureдаХранилище данных SQL AzureдаParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Предложение инструкции SELECT, которое разделяет результат запроса на группы строк обычно с целью выполнения одного или нескольких статистических вычислений в каждой группе.A SELECT statement clause that divides the query result into groups of rows, usually for the purpose of performing one or more aggregations on each group. Инструкция SELECT возвращает одну строку для каждой группы.The SELECT statement returns one row per group.

СинтаксисSyntax

Значок ссылки на раздел Синтаксические обозначения в Transact-SQL (Transact-SQL)Topic link icon Transact-SQL Syntax Conventions (Transact-SQL)

-- Syntax for SQL Server and Azure SQL Database   
-- ISO-Compliant Syntax  

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 ] )  


-- For backward compatibility only.
-- Non-ISO-Compliant Syntax for SQL Server and Azure SQL Database 

GROUP BY 
      [ ALL ] column-expression [ ,...n ] 
    | column-expression [ ,...n ] [ WITH { CUBE | ROLLUP } ]   
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

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

АргументыArguments

column-expressioncolumn-expression

Указывает на столбец или на нестатистическое вычисление в столбце.Specifies a column or a non-aggregate calculation on a column. Этот столбец может принадлежать таблице, производной таблице или представлению.This column can belong to a table, derived table, or view. Столбец должен быть указан в предложении FROM инструкции SELECT, но не обязательно должен присутствовать в списке SELECT.The column must appear in the FROM clause of the SELECT statement, but is not required to appear in the SELECT list.

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

Столбец должен быть указан в предложении FROM инструкции SELECT, но не обязательно должен присутствовать в списке SELECT.The column must appear in the FROM clause of the SELECT statement, but is not required to appear in the SELECT list. Каждый столбец таблицы или представления в любом нестатистическом выражении в списке <select> должен быть включен в список GROUP BY.However, each table or view column in any nonaggregate expression in the <select> list must be included in the GROUP BY list:

Следующие инструкции являются допустимыми.The following statements are allowed:

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;  

Следующие инструкции не являются допустимыми.The following statements are not allowed:

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

Выражение столбца не может содержать:The column expression cannot contain:

  • псевдоним столбца, определенный в списке SELECT.A column alias that is defined in the SELECT list. Выражение может использовать псевдоним столбца для производной таблицы, определенной в предложении FROM.It can use a column alias for a derived table that is defined in the FROM clause.
  • столбец типа text, ntext, или image.A column of type text, ntext, or image. Однако столбец типа text, ntext или image можно использовать как аргумент для функции, возвращающей значение допустимого типа данных.However, you can use a column of text, ntext, or image as an argument to a function that returns a value of a valid data type. Например, выражение может использовать SUBSTRING() и CAST().For example, the expression can use SUBSTRING() and CAST(). Это также относится к выражениям в предложении HAVING.This also applies to expressions in the HAVING clause.
  • методы типа данных xml.xml data type methods. Сюда может входить определяемой пользователем функции, которая использует методы типа данных xml.It can include a user-defined function that uses xml data type methods. Сюда может входить вычисляемый столбец, который использует методы типа данных xml.It can include a computed column that uses xml data type methods.
  • вложенный запрос.A subquery. Возвращается ошибка 144.Error 144 is returned.
  • столбец из индексированного представления.A column from an indexed view.

GROUP BY column-expression [ ,...n ]GROUP BY column-expression [ ,...n ]

Группирует результаты инструкции SELECT в соответствии со значениями в списке одного или нескольких выражений столбцов.Groups the SELECT statement results according to the values in a list of one or more column expressions.

Например, этот запрос создает таблицу Sales со столбцами Country, Region и Sales.For example, this query creates a Sales table with columns for Country, Region, and Sales. Он вставляет четыре строки, и две строки имеют совпадающие значения для столбцов Country и Region.It inserts four rows and two of the rows have matching values for Country and Region.

CREATE TABLE Sales ( Country varchar(50), Region varchar(50), Sales int );

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 содержатся указанные далее строки.The Sales table contains these rows:

CountryCountry RegionRegion SalesSales
CanadaCanada AlbertaAlberta 100100
CanadaCanada British ColumbiaBritish Columbia 200200
CanadaCanada British ColumbiaBritish Columbia 300300
United StatesUnited States MontanaMontana 100100

Этот запрос группирует значения столбцов Country и Region и возвращает общую сумму по каждому сочетанию значений.This next query groups Country and Region and returns the aggregate sum for each combination of values.

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

Результат запроса содержит 3 строки, так как существует 3 сочетания значений для Country и Region.The query result has 3 rows since there are 3 combinations of values for Country and Region. Значение TotalSales для Canada и British Columbia является суммой двух строк.The TotalSales for Canada and British Columbia is the sum of two rows.

CountryCountry RegionRegion TotalSalesTotalSales
CanadaCanada AlbertaAlberta 100100
CanadaCanada British ColumbiaBritish Columbia 500500
United StatesUnited States MontanaMontana 100100

GROUP BY ROLLUPGROUP BY ROLLUP

Создает группу для каждого сочетания выражений столбцов.Creates a group for each combination of column expressions. Кроме того, выполняет сведение результатов в промежуточные и общие итоги.In addition, it "rolls up" the results into subtotals and grand totals. Для этого запрос перемещается справа налево, уменьшая количество выражений столбцов, по которым он создает группы и агрегаты.To do this, it moves from right to left decreasing the number of column expressions over which it creates groups and the aggregation(s).

Порядок столбцов влияет на выходные данные ROLLUP и может отразиться на количестве строк в результирующем наборе.The column order affects the ROLLUP output and can affect the number of rows in the result set.

Например, GROUP BY ROLLUP (col1, col2, col3, col4) создает группы для каждой комбинации выражений столбцов в следующих списках.For example, GROUP BY ROLLUP (col1, col2, col3, col4) creates groups for each combination of column expressions in the following lists.

  • col1, col2, col3, col4col1, col2, col3, col4
  • col1, col2, col3, NULLcol1, col2, col3, NULL
  • col1, col2, NULL, NULLcol1, col2, NULL, NULL
  • col1, NULL, NULL, NULLcol1, NULL, NULL, NULL
  • NULL, NULL, NULL, NULL — это общий итог.NULL, NULL, NULL, NULL --This is the grand total

Принимая во внимание таблицу из предыдущего примера, этот код выполняет операцию GROUP BY ROLLUP вместо простого предложения GROUP BY.Using the table from the previous example, this code runs a GROUP BY ROLLUP operation instead of a simple GROUP BY.

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

Результатом запроса являются те же статистические вычисления, что и в простом предложении GROUP BY без ROLLUP.The query result has the same aggregations as the simple GROUP BY without the ROLLUP. Кроме того, здесь создаются промежуточные итоги для каждого значения в столбце Country.In addition, it creates subtotals for each value of Country. Наконец, выводится общий итог для всех строк.Finally, it gives a grand total for all rows. Результат имеет следующий вид:The result looks like this:

CountryCountry RegionRegion TotalSalesTotalSales
CanadaCanada AlbertaAlberta 100100
CanadaCanada British ColumbiaBritish Columbia 500500
CanadaCanada NULLNULL 600600
United StatesUnited States MontanaMontana 100100
United StatesUnited States NULLNULL 100100
NULLNULL NULLNULL 700700

GROUP BY CUBE ( )GROUP BY CUBE ( )

GROUP BY CUBE создает группы для всех возможных сочетаний столбцов.GROUP BY CUBE creates groups for all possible combinations of columns. Для GROUP BY CUBE (a, b) результатами являются группы для уникальных значений (a, b) (NULL, b), (a, NULL) и (NULL, NULL).For GROUP BY CUBE (a, b) the results has groups for unique values of (a, b), (NULL, b), (a, NULL), and (NULL, NULL).

Принимая во внимание таблицу из предыдущего примера, этот код выполняет операцию GROUP BY CUBE по столбцам Country и Region.Using the table from the previous examples, this code runs a GROUP BY CUBE operation on Country and Region.

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

Результатом запроса являются группы для уникальных значений (Country, Region), (NULL, Region), (Country, NULL) и (NULL, NULL).The query result has groups for unique values of (Country, Region), (NULL, Region), (Country, NULL), and (NULL, NULL). Результат выглядит следующим образом:The results look like this:

CountryCountry RegionRegion TotalSalesTotalSales
CanadaCanada AlbertaAlberta 100100
NULLNULL AlbertaAlberta 100100
CanadaCanada British ColumbiaBritish Columbia 500500
NULLNULL British ColumbiaBritish Columbia 500500
United StatesUnited States MontanaMontana 100100
NULLNULL MontanaMontana 100100
NULLNULL NULLNULL 700700
CanadaCanada NULLNULL 600600
United StatesUnited States NULLNULL 100100

GROUP BY GROUPING SETS ( )GROUP BY GROUPING SETS ( )

Параметр GROUPING SETS позволяет объединять несколько предложений GROUP BY в одно предложение GROUP BY.The GROUPING SETS option gives you the ability to combine multiple GROUP BY clauses into one GROUP BY clause. Результаты эквивалентны тем, что формируются с применением конструкции UNION ALL к указанным группам.The results are the equivalent of UNION ALL of the specified groups.

Например, GROUP BY ROLLUP (Country, Region) и GROUP BY GROUPING SETS ( ROLLUP (Country, Region) ) возвращают одинаковые результаты.For example, GROUP BY ROLLUP (Country, Region) and GROUP BY GROUPING SETS ( ROLLUP (Country, Region) ) return the same results.

Если параметр GROUPING SETS имеет два или более элементов, результатом будет объединение элементов.When GROUPING SETS has two or more elements, the results are a union of the elements. Этот пример возвращает объединение результатов ROLLUP и CUBE для Country и Region.This example returns the union of the ROLLUP and CUBE results for Country and Region.

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

Результаты будут такими же, так как этот запрос возвращает объединение двух инструкций GROUP BY.The results are the same as this query that returns a union of the two GROUP BY statements.

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

SQL не консолидирует повторяющиеся группы, созданные для списка GROUPING SETS.SQL does not consolidate duplicate groups generated for a GROUPING SETS list. Например, в GROUP BY ( (), CUBE (Country, Region) ) оба элемента возвращают строку для общего итога, и в списке результатов будут указаны обе строки.For example, in GROUP BY ( (), CUBE (Country, Region) ), both elements return a row for the grand total and both rows will be listed in the results.

GROUP BY ()GROUP BY ()

Указывает пустую группу, что приводит к созданию общего итога.Specifies the empty group which generates the grand total. Он полезен в качестве одного из элементов GROUPING SET.This is useful as one of the elements of a GROUPING SET. Например, эта инструкция выводит общий объем продаж для каждой страны, а затем — общий итог по всем странам.For example, this statement gives the total sales for each country and then gives the grand-total for all countries.

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

GROUP BY [ ALL ] column-expression [ ,...n ]GROUP BY [ ALL ] column-expression [ ,...n ]

Применимо к: SQL Server и база данных SQL AzureApplies to: SQL Server and Azure SQL Database

ПРИМЕЧАНИЕ. Этот синтаксис поддерживается только для обратной совместимости.NOTE: This syntax is provided for backward compatibility only. В будущей версии он будет удален.It will be removed in a future version. Избегайте использования этого синтаксиса в новых разработках и учитывайте необходимость изменения в будущем приложений, использующих этот синтаксис сейчас.Avoid using this syntax in new development work, and plan to modify applications that currently use this syntax.

Указывает включить все группы в результаты независимо от того, соответствуют ли они условиям поиска в предложении WHERE.Specifies to include all groups in the results regardless of whether they meet the search criteria in the WHERE clause. Группы, которые не соответствуют условиям поиска, имеют значение NULL для статистического вычисления.Groups that don't meet the search criteria have NULL for the aggregation.

GROUP BY ALLGROUP BY ALL:

  • Не поддерживается в запросах с доступом к удаленным таблицам, если в запросе присутствует также предложение WHERE.Is not supported in queries that access remote tables if there is also a WHERE clause in the query.
  • Применение предложения к столбцам, имеющим атрибут FILESTREAM, приведет к ошибке.Will fail on columns that have the FILESTREAM attribute.

WITH (DISTRIBUTED_AGG)WITH (DISTRIBUTED_AGG)

Применимо к: хранилище данных SQL Azure и Parallel Data WarehouseApplies to: Azure SQL Data Warehouse and Parallel Data Warehouse

Указание запроса DISTRIBUTED_AGG заставляет систему MPP перераспределять таблицу по определенному столбцу до выполнения статистического вычисления.The DISTRIBUTED_AGG query hint forces the massively parallel processing (MPP) system to redistribute a table on a specific column before performing an aggregation. Только один столбец в предложении GROUP BY может иметь указание запроса DISTRIBUTED_AGG.Only one column in the GROUP BY clause can have a DISTRIBUTED_AGG query hint. После завершения запроса перераспределенная таблица удаляется.After the query finishes, the redistributed table is dropped. Исходная таблица не изменяется.The original table is not changed.

Примечание. Указание запроса DISTRIBUTED_AGG предоставляется для обеспечения обратной совместимости с более ранними версиями Parallel Data Warehouse и не способствует повышению производительности большинства запросов.NOTE: The DISTRIBUTED_AGG query hint is provided for backwards compatibility with earlier Parallel Data Warehouse versions and will not improve performance for most queries. По умолчанию MPP уже перераспределяет данные для улучшения производительности для статистических вычислений.By default, MPP already redistributes data as necessary to improve performance for aggregations.

Общие замечанияGeneral Remarks

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

Список SELECT:SELECT list:

  • Векторные агрегаты.Vector aggregates. Если в список SELECT включены агрегатные функции, инструкция GROUP BY вычисляет сводные значения для каждой группы.If aggregate functions are included in the SELECT list, GROUP BY calculates a summary value for each group. Они известны как векторные статистические вычисления.These are known as vector aggregates.
  • Статистические функции DISTINCT.Distinct aggregates. С конструкциями ROLLUP, CUBE и GROUPING SETS поддерживаются статистические функции AVG (DISTINCT column_name), COUNT (DISTINCT column_name) и SUM (DISTINCT column_name).The aggregates AVG (DISTINCT column_name), COUNT (DISTINCT column_name), and SUM (DISTINCT column_name) are supported with ROLLUP, CUBE, and GROUPING SETS.

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

  • SQL удаляет строки, которые не соответствуют условиям в предложении WHERE, до выполнения любых операций группирования.SQL removes Rows that do not meet the conditions in the WHERE clause before any grouping operation is performed.

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

  • SQL использует предложение HAVING для фильтрации групп в результирующем наборе.SQL uses the having clause to filter groups in the result set.

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

  • Чтобы упорядочить результирующий набор, необходимо использовать предложение ORDER BY.Use the ORDER BY clause to order the result set. Применение предложения GROUP BY не упорядочивает результирующий набор.The GROUP BY clause does not order the result set.

Значения NULL:NULL values:

  • Если столбец группирования содержит значения NULL, они рассматриваются как равные и помещаются в одну группу.If a grouping column contains NULL values, all NULL values are considered equal and they are collected into a single group.

ОграниченияLimitations and Restrictions

Применимо к: SQL Server (начиная с версии 2008), хранилище данных SQL AzureApplies to: SQL Server (starting with 2008) and Azure SQL Data Warehouse

Максимальная емкостьMaximum capacity

Для предложения GROUP BY, использующего ROLLUP, CUBE или GROUPING SETS, используется максимум 32 выражения.For a GROUP BY clause that uses ROLLUP, CUBE, or GROUPING SETS, the maximum number of expressions is 32. Максимальное количество групп — 4096 (212).The maximum number of groups is 4096 (212). Следующие примеры завершаются ошибкой, поскольку предложение GROUP BY имеет больше 4096 групп.The following examples fail because the GROUP BY clause has more than 4096 groups.

  • В следующем примере формируется 4097 (212 + 1) группирующих наборов, поэтому пример завершится ошибкой.The following example generates 4097 (212 + 1) grouping sets and will fail.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )  
    
  • В следующем примере формируется 4097 (212 + 1) групп, поэтому пример завершится ошибкой.The following example generates 4097 (212 + 1) groups and will fail. И функция CUBE (), и группирующий набор () формируют строку общего итога, а повторяющиеся группирующие наборы не устраняются.Both CUBE () and the () grouping set produce a grand total row and duplicate grouping sets are not eliminated.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())  
    
  • В этом примере используется синтаксис обратной совместимости.This example uses the backwards compatible syntax. В примере создается 8192 (213) группирующих наборов, поэтому он завершится ошибкой.It generates 8192 (213) grouping sets and will fail.

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

    Для предложений GROUP BY с поддержкой обратной совместимости и не содержащих операторов CUBE или ROLLUP количество элементов GROUP BY ограничивается размером столбцов GROUP BY, статистически обрабатываемых столбцов и статистических значений, включенных в запрос.For backwards compatible GROUP BY clauses that do not contain CUBE or ROLLUP, the number of group by items is limited by the GROUP BY column sizes, the aggregated columns, and the aggregate values involved in the query. Это объясняется ограничением размера промежуточной рабочей таблицы (8060 байт), необходимой для хранения промежуточных результатов запроса.This limit originates from the limit of 8,060 bytes on the intermediate worktable that is needed to hold intermediate query results. При указании CUBE или ROLLUP максимально разрешенное количество выражений группирования равно 12.A maximum of 12 grouping expressions is permitted when CUBE or ROLLUP is specified.

Поддержка функций предложения GROUP BY, совместимых с ISO и ANSI SQL-2006Support for ISO and ANSI SQL-2006 GROUP BY Features

Предложение GROUP BY поддерживает все возможности предложения GROUP BY, включенные в стандарт SQL-2006, со следующими синтаксическими исключениями.The GROUP BY clause supports all GROUP BY features that are included in the SQL-2006 standard with the following syntax exceptions:

  • Применение группирующих наборов в предложении GROUP BY недопустимо, если они не составляют часть явного списка GROUPING SETS.Grouping sets are not allowed in the GROUP BY clause unless they are part of an explicit GROUPING SETS list. Например, предложение GROUP BY Column1, (Column2, ...ColumnN) допускается в этом стандарте, но не в Transact-SQL.For example, GROUP BY Column1, (Column2, ...ColumnN) is allowed in the standard but not in Transact-SQL. Transact-SQL поддерживает GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) и GROUP BY Column1, Column2, ... ColumnN, которые семантически эквивалентны.Transact-SQL supports GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) and GROUP BY Column1, Column2, ... ColumnN, which are semantically equivalent. Эти инструкции семантически эквивалентны предыдущему примеру предложения GROUP BY.These are semantically equivalent to the previous GROUP BY example. Это позволяет избежать возможности неправильной интерпретации предложения GROUP BY Column1, (Column2, ...ColumnN) как GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), не являющихся семантически эквивалентными.This is to avoid the possibility that GROUP BY Column1, (Column2, ...ColumnN) might be misinterpreted as GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), which are not semantically equivalent.

  • Применение группирующих наборов внутри группирующих наборов не допускается.Grouping sets are not allowed inside grouping sets. Например, предложение GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn)) допускается в стандарте SQL-2006, но не в Transact-SQL.For example, GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn)) is allowed in the SQL-2006 standard but not in 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 и имеют более понятный синтаксис.Transact-SQL allows GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn ) or GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) ), which are semantically equivalent to the first GROUP BY example and have a more clear syntax.

  • GROUP BY [ALL/DISTINCT] используется только в простом предложении GROUP BY, которое содержит выражения столбцов.GROUP BY [ALL/DISTINCT] is only allowed in a simple GROUP BY clause that contains column expressions. Это предложение не может использоваться с конструкциями GROUPING SETS, ROLLUP, CUBE, WITH CUBE или WITH ROLLUP.It is not allowed with the GROUPING SETS, ROLLUP, CUBE, WITH CUBE or WITH ROLLUP constructs. Ключевое слово ALL применяется по умолчанию и задано неявно.ALL is the default and is implicit. Оно допускается только в синтаксисе обратной совместимости.It is also only allowed in the backwards compatible syntax.

Сравнение поддерживаемых функций предложения GROUP BYComparison of Supported GROUP BY Features

В следующей таблице описаны поддерживаемые возможности предложения GROUP BY с учетом версии SQL и уровня совместимости базы данных.The following table describes the GROUP BY features that are supported based upon SQL versions and database compatibility level.

КомпонентFeature Службы SQL Server Integration ServicesSQL Server Integration Services Уровень совместимости SQL Server — 100 или болееSQL Server compatibility level 100 or higher Уровень совместимости SQL Server 2008 или более поздней версии — 90.SQL Server 2008 or later with compatibility level 90.
Статистические функции DISTINCTDISTINCT aggregates Не поддерживаются для конструкций WITH CUBE или WITH ROLLUP.Not supported for WITH CUBE or WITH ROLLUP. Поддерживаются для конструкций WITH CUBE, WITH ROLLUP, GROUPING SETS, CUBE или ROLLUP.Supported for WITH CUBE, WITH ROLLUP, GROUPING SETS, CUBE, or ROLLUP. Аналогично уровню совместимости 100.Same as compatibility level 100.
Определяемая пользователем функция с именем CUBE или ROLLUP в предложении GROUP BYUser-defined function with CUBE or ROLLUP name in the GROUP BY clause Определяемая пользователем функция dbo.cube(arg1,...argN) or dbo.rollup(arg1,...argN) в предложении GROUP BY недопустима.User-defined function dbo.cube(arg1,...argN) or dbo.rollup(arg1,...argN) in the GROUP BY clause is allowed.

Например: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);.For example: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
Определяемая пользователем функция dbo.cube (arg1,...argN ) or dbo.rollup( arg1 ,...argN) в предложении GROUP BY недопустима.User-defined function dbo.cube (arg1,...argN ) or dbo.rollup( arg1 ,...argN) in the GROUP BY clause is not allowed.

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

Возвращается сообщение об ошибке: "Неправильный синтаксис рядом с ключевым словом "cube"|"rollup"".The following error message is returned: "Incorrect syntax near the keyword 'cube'|'rollup'."

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

Следующий пример является допустимым: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y);.The following example is allowed: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y);
Определяемая пользователем функция dbo.cube (arg1,...argN) or dbo.rollup(arg1,...argN) в предложении GROUP BY недопустима.User-defined function dbo.cube (arg1,...argN) or dbo.rollup(arg1,...argN) in the GROUP BY clause is allowed

Например: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);.For example: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
GROUPING SETSGROUPING SETS Не поддерживаетсяNot supported ПоддерживаетсяSupported ПоддерживаетсяSupported
CUBECUBE Не поддерживаетсяNot supported ПоддерживаетсяSupported Не поддерживаетсяNot supported
ROLLUPROLLUP Не поддерживаетсяNot supported ПоддерживаетсяSupported Не поддерживаетсяNot supported
Общий итог, такой как GROUP BY ()Grand total, such as GROUP BY () Не поддерживаетсяNot supported ПоддерживаетсяSupported ПоддерживаетсяSupported
Функция GROUPING_IDGROUPING_ID function Не поддерживаетсяNot supported ПоддерживаетсяSupported ПоддерживаетсяSupported
Функция GROUPINGGROUPING function ПоддерживаетсяSupported ПоддерживаетсяSupported ПоддерживаетсяSupported
WITH CUBEWITH CUBE ПоддерживаетсяSupported ПоддерживаетсяSupported ПоддерживаетсяSupported
WITH ROLLUPWITH ROLLUP ПоддерживаетсяSupported ПоддерживаетсяSupported ПоддерживаетсяSupported
Удаление "повторяющегося" группирования с помощью конструкции WITH CUBE или WITH ROLLUPWITH CUBE or WITH ROLLUP "duplicate" grouping removal ПоддерживаетсяSupported ПоддерживаетсяSupported ПоддерживаетсяSupported

ПримерыExamples

A.A. Использование простого предложения GROUP BYUse a simple GROUP BY clause

В следующем примере извлекается сумма для каждого SalesOrderID из таблицы SalesOrderDetail.The following example retrieves the total for each SalesOrderID from the SalesOrderDetail table. В примере используется база данных AdventureWorks.This example uses AdventureWorks.

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

Б.B. Использование предложения GROUP BY с несколькими таблицамиUse a GROUP BY clause with multiple tables

В следующем примере из таблицы Address, соединенной с таблицей EmployeeAddress, получается количество работников для каждого города City.The following example retrieves the number of employees for each City from the Address table joined to the EmployeeAddress table. В примере используется база данных AdventureWorks.This example uses AdventureWorks.

SELECT a.City, COUNT(bea.AddressID) 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 в выраженияхUse a GROUP BY clause with an expression

В следующем примере показано, как извлечь данные об общем объеме продаж за каждый год с помощью функции DATEPART.The following example retrieves the total sales for each year by using the DATEPART function. Одно и то же выражение должно присутствовать как в списке SELECT, так и в предложении GROUP BY.The same expression must be present in both the SELECT list and GROUP BY clause.

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 с предложением HAVINGUse a GROUP BY clause with a HAVING clause

В следующем примере используется предложение HAVING, чтобы указать, какая из групп, сформированная в предложении GROUP BY, должна быть включена в результирующий набор.The following example uses the HAVING clause to specify which of the groups generated in the GROUP BY clause should be included in the result set.

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);  

Примеры: хранилище данных SQL и Parallel Data WarehouseExamples: SQL Data Warehouse and Parallel Data Warehouse

Д.E. Базовое использование предложения GROUP BYBasic use of the GROUP BY clause

В следующем примере вычисляется общий объем всех продаж за каждый день.The following example finds the total amount for all sales on each day. Выводится только одна строка, содержащая общий объем продаж по каждому дню.One row containing the sum of all sales is returned for each day.

-- Uses AdventureWorksDW  

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

Е.F. Базовое использование указания DISTRIBUTED_AGGBasic use of the DISTRIBUTED_AGG hint

В этом примере показано указание запроса DISTRIBUTED_AGG для принудительного перемещения в таблице по столбцу CustomerKey перед выполнением статистического вычисления.This example uses the DISTRIBUTED_AGG query hint to force the appliance to shuffle the table on the CustomerKey column before performing the aggregation.

-- Uses AdventureWorksDW  

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

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

Если в списке Select статистические вычисления, каждый столбец в списке Select должен быть включен в список GROUP BY.When the select list has no aggregations, each column in the select list must be included in the GROUP BY list. Вычисляемые столбцы в списке Select можно указать в списке GROUP BY (делать это необязательно).Computed columns in the select list can be listed, but are not required, in the GROUP BY list. Ниже приведены примеры синтаксически правильных инструкций SELECT.These are examples of syntactically valid SELECT statements:

-- 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 SalesTax FROM FactInternetSales GROUP BY SalesAmount;  
SELECT SalesAmount FROM FactInternetSales GROUP BY SalesAmount, SalesAmount*1.10;  

З.H. Использование GROUP BY с несколькими выражениями GROUP BYUsing a GROUP BY with multiple GROUP BY expressions

В следующем примере группируются результаты с помощью нескольких критериев GROUP BY.The following example groups results using multiple GROUP BY criteria. Если в каждой группе OrderDateKey есть подгруппы, которые могут отличаться по DueDateKey, для результирующего набора будет определено новое группирование.If, within each OrderDateKey group, there are subgroups that can be differentiated by DueDateKey, a new grouping will be defined for the result set.

-- Uses AdventureWorks  

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

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

В следующем примере используется предложение HAVING, чтобы указать, какие группы, сформированные в предложении GROUP BY, должны быть включены в результирующий набор.The following example uses the HAVING clause to specify the groups generated in the GROUP BY clause that should be included in the result set. В результаты будут включены только группы с датами заказов в 2004 году или более поздними.Only those groups with order dates in 2004 or later will be included in the results.

-- Uses AdventureWorks  

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

См. такжеSee Also

GROUPING_ID (Transact-SQL) GROUPING_ID (Transact-SQL)
GROUPING (Transact-SQL) GROUPING (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
Предложение SELECT (Transact-SQL)SELECT Clause (Transact-SQL)