SELECT – GROUP BY – Transact-SQLSELECT - GROUP BY- Transact-SQL

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Uma cláusula da instrução SELECT que divide o resultado da consulta em grupos de linhas, normalmente, com a finalidade de executar uma ou mais agregações em cada grupo.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. A instrução SELECT retorna uma linha por grupo.The SELECT statement returns one row per group.

SintaxeSyntax

Ícone de link do tópico Convenções da sintaxe 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
    | ROLLUP ( <group_by_expression> [ ,...n ] ) 
} [ ,...n ]

ArgumentosArguments

column-expressioncolumn-expression

Especifica uma coluna ou um cálculo de não agregação em uma coluna.Specifies a column or a non-aggregate calculation on a column. Essa coluna pode pertencer a uma tabela, a uma tabela derivada ou a uma exibição.This column can belong to a table, derived table, or view. A coluna precisa aparecer na cláusula FROM da instrução SELECT, mas não precisa aparecer na lista de SELECT.The column must appear in the FROM clause of the SELECT statement, but is not required to appear in the SELECT list.

Para saber quais são as expressões válidas, confira Expressão.For valid expressions, see expression.

A coluna precisa aparecer na cláusula FROM da instrução SELECT, mas não precisa aparecer na lista de SELECT.The column must appear in the FROM clause of the SELECT statement, but is not required to appear in the SELECT list. No entanto, cada coluna de tabela ou de exibição em qualquer expressão de não agregação na lista de <select> precisa estar incluída na lista de GROUP BY:However, each table or view column in any nonaggregate expression in the <select> list must be included in the GROUP BY list:

As seguintes instruções são permitidas: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;  

As seguintes instruções não são permitidas: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;  

A expressão de coluna não pode conter:The column expression cannot contain:

  • Um alias de coluna definido na lista de SELECT.A column alias that is defined in the SELECT list. Ela pode usar um alias de coluna para uma tabela derivada definida na cláusula FROM.It can use a column alias for a derived table that is defined in the FROM clause.
  • Uma coluna do tipo text, ntext ou image.A column of type text, ntext, or image. No entanto, você pode usar uma coluna de texto, ntext ou imagem como um argumento para uma função que retorna um valor de um tipo de dados válido.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. Por exemplo, a expressão pode usar SUBSTRING() e CAST().For example, the expression can use SUBSTRING() and CAST(). Isso também se aplica às expressões na cláusula HAVING.This also applies to expressions in the HAVING clause.
  • Métodos do tipo de dados XML.xml data type methods. Ela pode incluir uma função definida pelo usuário que usa métodos do tipo de dados XML.It can include a user-defined function that uses xml data type methods. Ela pode incluir uma coluna computada que usa métodos do tipo de dados XML.It can include a computed column that uses xml data type methods.
  • Uma subconsulta.A subquery. O erro 144 é retornado.Error 144 is returned.
  • Uma coluna de uma exibição indexada.A column from an indexed view.

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

Agrupa os resultados da instrução SELECT de acordo com os valores em uma lista de uma ou mais expressões de coluna.Groups the SELECT statement results according to the values in a list of one or more column expressions.

Por exemplo, essa consulta cria a tabela Vendas com as colunas País, Região e Vendas.For example, this query creates a Sales table with columns for Country, Region, and Sales. Ela insere quatro linhas e duas da linhas têm valores correspondentes para País e Região.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);

A tabela Vendas contém estas linhas:The Sales table contains these rows:

PaísCountry RegiãoRegion SalesSales
CanadaCanada AlbertaAlberta 100100
CanadaCanada Colúmbia BritânicaBritish Columbia 200200
CanadaCanada Colúmbia BritânicaBritish Columbia 300300
Estados UnidosUnited States MontanaMontana 100100

Essa próxima consulta agrupa País e Região e retorna a soma de agregação para cada combinação de valores.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;

O resultado da consulta tem 3 linhas, pois há 3 combinações de valores para País e Região.The query result has 3 rows since there are 3 combinations of values for Country and Region. TotalSales para Canadá e Colúmbia Britânica é a soma de duas linhas.The TotalSales for Canada and British Columbia is the sum of two rows.

PaísCountry RegiãoRegion TotalSalesTotalSales
CanadaCanada AlbertaAlberta 100100
CanadaCanada Colúmbia BritânicaBritish Columbia 500500
Estados UnidosUnited States MontanaMontana 100100

GROUP BY ROLLUPGROUP BY ROLLUP

Cria um grupo para cada combinação de expressões de coluna.Creates a group for each combination of column expressions. Além disso, ele "acumula" os resultados em subtotais e totais gerais.In addition, it "rolls up" the results into subtotals and grand totals. Para isso, ele vai da direita para a esquerda, diminuindo o número de expressões de coluna sobre as quais ele cria grupos e agregações.To do this, it moves from right to left decreasing the number of column expressions over which it creates groups and the aggregation(s).

A ordem da coluna afeta a saída de ROLLUP e pode afetar o número de linhas no conjunto de resultados.The column order affects the ROLLUP output and can affect the number of rows in the result set.

Por exemplo, GROUP BY ROLLUP (col1, col2, col3, col4) cria grupos para cada combinação de expressões de coluna nas listas a seguir.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 – esse é o total geralNULL, NULL, NULL, NULL --This is the grand total

Usando a tabela do exemplo anterior, esse código executa uma operação de GROUP BY ROLLUP em vez de um GROUP BY simples.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);

O resultado da consulta tem as mesmas agregações que o GROUP BY simples sem o ROLLUP.The query result has the same aggregations as the simple GROUP BY without the ROLLUP. Além disso, ele cria subtotais para cada valor de País.In addition, it creates subtotals for each value of Country. Por fim, ele fornece um total geral para todas as linhas.Finally, it gives a grand total for all rows. O resultado será semelhante a este:The result looks like this:

PaísCountry RegiãoRegion TotalSalesTotalSales
CanadaCanada AlbertaAlberta 100100
CanadaCanada Colúmbia BritânicaBritish Columbia 500500
CanadaCanada NULLNULL 600600
Estados UnidosUnited States MontanaMontana 100100
Estados UnidosUnited States NULLNULL 100100
NULLNULL NULLNULL 700700

GROUP BY CUBE ( )GROUP BY CUBE ( )

GROUP BY CUBE cria grupos para todas as combinações de colunas possíveis.GROUP BY CUBE creates groups for all possible combinations of columns. GROUP BY CUBE (a, b) os resultados têm grupos de valores exclusivos de (a, b), (NULL, b), (a, NULL) e (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).

Usando a tabela dos exemplos anteriores, esse código executa uma operação de GROUP BY CUBE em País e em Região.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);

O resultado da consulta tem grupos de valores exclusivos (País, Região), (NULL, Região), (País, NULL) e (NULL, NULL).The query result has groups for unique values of (Country, Region), (NULL, Region), (Country, NULL), and (NULL, NULL). Os resultados serão semelhantes a estes:The results look like this:

PaísCountry RegiãoRegion TotalSalesTotalSales
CanadaCanada AlbertaAlberta 100100
NULLNULL AlbertaAlberta 100100
CanadaCanada Colúmbia BritânicaBritish Columbia 500500
NULLNULL Colúmbia BritânicaBritish Columbia 500500
Estados UnidosUnited States MontanaMontana 100100
NULLNULL MontanaMontana 100100
NULLNULL NULLNULL 700700
CanadaCanada NULLNULL 600600
Estados UnidosUnited States NULLNULL 100100

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

A opção de GROUPING SETS oferece a capacidade de combinar várias cláusulas GROUP BY em uma única cláusula GROUP BY.The GROUPING SETS option gives you the ability to combine multiple GROUP BY clauses into one GROUP BY clause. Os resultados são o equivalente de UNION ALL dos grupos especificados.The results are the equivalent of UNION ALL of the specified groups.

Por exemplo, GROUP BY ROLLUP (Country, Region) e GROUP BY GROUPING SETS ( ROLLUP (Country, Region) ) retornam os mesmos resultados.For example, GROUP BY ROLLUP (Country, Region) and GROUP BY GROUPING SETS ( ROLLUP (Country, Region) ) return the same results.

Quando conjuntos de GROUPING SETS têm dois ou mais elementos, os resultados são uma união dos elementos.When GROUPING SETS has two or more elements, the results are a union of the elements. Este exemplo retorna a união dos resultados de ROLLUP e CUBE para País e Região.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) );

Os resultados são iguais, pois essa consulta retorna uma união de duas instruções 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);

O SQL não consolida grupos duplicados gerados por uma lista de GROUPING SETS.SQL does not consolidate duplicate groups generated for a GROUPING SETS list. Por exemplo, em GROUP BY ( (), CUBE (Country, Region) ), ambos os elementos retornarão uma linha para o total geral e ambas as linhas serão listadas nos resultados.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 ()

Especifica o grupo vazio que gera o total geral.Specifies the empty group which generates the grand total. Isso é útil como um dos elementos de um GROUPING SET.This is useful as one of the elements of a GROUPING SET. Por exemplo, esta instrução fornece o total de vendas para cada país e, em seguida, o total geral para todos os países.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 ]

Aplica-se a: SQL Server e Banco de Dados SQL do AzureApplies to: SQL Server and Azure SQL Database

OBSERVAÇÃO: Esta sintaxe é fornecida apenas para fins de compatibilidade com versões anteriores.NOTE: This syntax is provided for backward compatibility only. Ela será removida em uma versão futura.It will be removed in a future version. Evite usar essa sintaxe em novos trabalhos de desenvolvimento e planeje modificar os aplicativos que a usam no momento.Avoid using this syntax in new development work, and plan to modify applications that currently use this syntax.

Especifica a inclusão de todos os grupos nos resultados, independentemente se eles atendem aos critérios de pesquisa na cláusula WHERE.Specifies to include all groups in the results regardless of whether they meet the search criteria in the WHERE clause. Os grupos que não atendem aos critérios de pesquisa têm NULL para a agregação.Groups that don't meet the search criteria have NULL for the aggregation.

GROUP BY ALL:GROUP BY ALL:

  • Não é compatível com consultas que acessam tabelas remotas quando também há uma cláusula WHERE na consulta.Is not supported in queries that access remote tables if there is also a WHERE clause in the query.
  • Falhará em colunas que têm o atributo FILESTREAM.Will fail on columns that have the FILESTREAM attribute.

WITH (DISTRIBUTED_AGG)WITH (DISTRIBUTED_AGG)

Aplica-se a: SQL Data Warehouse do Azure e Parallel Data WarehouseApplies to: Azure SQL Data Warehouse and Parallel Data Warehouse

A dica de consulta DISTRIBUTED_AGG força o sistema de MPP (processamento paralelo massivo) a redistribuir uma tabela em uma coluna específica antes de executar uma agregação.The DISTRIBUTED_AGG query hint forces the massively parallel processing (MPP) system to redistribute a table on a specific column before performing an aggregation. Somente uma coluna na cláusula GROUP BY pode ter uma dica de consulta DISTRIBUTED_AGG.Only one column in the GROUP BY clause can have a DISTRIBUTED_AGG query hint. Depois que a consulta for concluída, a tabela redistribuída será descartada.After the query finishes, the redistributed table is dropped. A tabela original não é alterada.The original table is not changed.

OBSERVAÇÃO: A dica de consulta DISTRIBUTED_AGG é fornecida para fins de compatibilidade com versões anteriores do Parallel Data Warehouse e não melhora o desempenho na maioria das consultas.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. Por padrão, o MPP já redistribui os dados conforme o necessário para melhorar o desempenho das agregações.By default, MPP already redistributes data as necessary to improve performance for aggregations.

Comentários geraisGeneral Remarks

Como GROUP BY interage com a instrução SELECTHow GROUP BY interacts with the SELECT statement

Lista de SELECT:SELECT list:

  • Agregações de vetor.Vector aggregates. Se funções de agregação são incluídas na lista de SELECT, GROUP BY calcula um valor resumido para cada grupo.If aggregate functions are included in the SELECT list, GROUP BY calculates a summary value for each group. São conhecidas como agregações de vetor.These are known as vector aggregates.
  • Agregações de distinção.Distinct aggregates. As agregações AVG (DISTINCT column_name), COUNT (DISTINCT column_name) e SUM (DISTINCT column_name) são compatíveis com ROLLUP, CUBE e GROUPING SETS.The aggregates AVG (DISTINCT column_name), COUNT (DISTINCT column_name), and SUM (DISTINCT column_name) are supported with ROLLUP, CUBE, and GROUPING SETS.

Cláusula WHERE:WHERE clause:

  • O SQL remove as linhas que não atendem às condições na cláusula WHERE antes que qualquer operação de agrupamento seja executada.SQL removes Rows that do not meet the conditions in the WHERE clause before any grouping operation is performed.

Cláusula HAVING:HAVING clause:

  • O SQL usa a cláusula having para filtrar grupos no conjunto de resultados.SQL uses the having clause to filter groups in the result set.

Cláusula ORDER BY:ORDER BY clause:

  • Use a cláusula ORDER BY para ordenar o conjunto de resultados.Use the ORDER BY clause to order the result set. A cláusula GROUP BY não ordena o conjunto de resultados.The GROUP BY clause does not order the result set.

Valores NULL:NULL values:

  • Se uma coluna de agrupamento contiver valores NULL, todos os valores NULL serão considerados iguais e serão coletados em um único grupo.If a grouping column contains NULL values, all NULL values are considered equal and they are collected into a single group.

Limitações e RestriçõesLimitations and Restrictions

Aplica-se a: SQL Server (começando com o 2008) e SQL Data Warehouse do AzureApplies to: SQL Server (starting with 2008) and Azure SQL Data Warehouse

Capacidade máximaMaximum capacity

Para uma cláusula GROUP BY que usa ROLLUP, CUBE ou GROUPING SETS, o número máximo de expressões é 32.For a GROUP BY clause that uses ROLLUP, CUBE, or GROUPING SETS, the maximum number of expressions is 32. O número máximo de grupos é 4096 (212).The maximum number of groups is 4096 (212). Os exemplos a seguir falham porque a cláusula GROUP BY tem mais de 4096 grupos.The following examples fail because the GROUP BY clause has more than 4096 groups.

  • O exemplo a seguir gera 4097 (212 + 1) conjuntos de agrupamentos e falhará.The following example generates 4097 (212 + 1) grouping sets and will fail.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )  
    
  • O exemplo a seguir gera 4097 (212 + 1) grupos e falhará.The following example generates 4097 (212 + 1) groups and will fail. CUBE () e o conjunto de agrupamentos () produzem uma linha de total geral e os conjuntos de agrupamentos duplicados não são eliminados.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), ())  
    
  • Este exemplo usa a sintaxe compatível com versões anteriores.This example uses the backwards compatible syntax. Ele gera 8192 (213) conjuntos de agrupamentos e falhará.It generates 8192 (213) grouping sets and will fail.

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

    Para cláusulas GROUP BY compatíveis com versões anteriores que não contêm CUBE nem ROLLUP, o número de itens de group by é limitado pelos tamanhos da coluna GROUP BY, pelas colunas agregadas e pelos valores de agregação envolvidos na consulta.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. Esse limite tem origem no limite de 8.060 bytes na tabela de trabalho intermediária que é necessária para manter resultados de consulta intermediários.This limit originates from the limit of 8,060 bytes on the intermediate worktable that is needed to hold intermediate query results. Um máximo de 12 expressões de agrupamento é permitido quando CUBE ou ROLLUP é especificado.A maximum of 12 grouping expressions is permitted when CUBE or ROLLUP is specified.

Suporte para os recursos GROUP BY ISO e ANSI SQL-2006Support for ISO and ANSI SQL-2006 GROUP BY Features

A cláusula GROUP BY é compatível com todos os recursos de GROUP BY incluídos no padrão SQL-2006 com as seguintes exceções de sintaxe:The GROUP BY clause supports all GROUP BY features that are included in the SQL-2006 standard with the following syntax exceptions:

  • Conjuntos de agrupamentos não são permitidos na cláusula GROUP BY, a menos que sejam parte de uma lista de GROUPING SETS explícita.Grouping sets are not allowed in the GROUP BY clause unless they are part of an explicit GROUPING SETS list. Por exemplo, GROUP BY Column1, (Column2, ...ColumnN) é permitido no padrão, mas não no Transact-SQL.For example, GROUP BY Column1, (Column2, ...ColumnN) is allowed in the standard but not in Transact-SQL. O Transact-SQL é compatível com GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) e GROUP BY Column1, Column2, ... ColumnN, que são semanticamente equivalentes.Transact-SQL supports GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) and GROUP BY Column1, Column2, ... ColumnN, which are semantically equivalent. Esses são semanticamente equivalentes ao exemplo GROUP BY anterior.These are semantically equivalent to the previous GROUP BY example. Isso é para evitar a possibilidade de que GROUP BY Column1, (Column2, ...ColumnN) seja ser interpretado incorretamente como GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), que não são semanticamente equivalentes.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.

  • Conjuntos de agrupamentos não são permitidos em conjuntos de agrupamentos.Grouping sets are not allowed inside grouping sets. Por exemplo, GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn)) é permitido no padrão SQL-2006, mas não no 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. O Transact-SQL permite GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn ) ou GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) ), que são semanticamente equivalentes ao primeiro exemplo de GROUP BY e têm uma sintaxe mais clara.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] só é permitido em uma cláusula GROUP BY simples que contém expressões de coluna.GROUP BY [ALL/DISTINCT] is only allowed in a simple GROUP BY clause that contains column expressions. Ele não é permitido com as construções GROUPING SETS, ROLLUP, CUBE, WITH CUBE ou WITH ROLLUP.It is not allowed with the GROUPING SETS, ROLLUP, CUBE, WITH CUBE or WITH ROLLUP constructs. ALL é o padrão e está implícito.ALL is the default and is implicit. Ele também só é permitido na sintaxe compatível com versões anteriores.It is also only allowed in the backwards compatible syntax.

Comparação de recursos GROUP BY com suporteComparison of Supported GROUP BY Features

A tabela a seguir descreve os recursos de GROUP BY compatíveis, com base nas versões do SQL e no nível de compatibilidade do banco de dados.The following table describes the GROUP BY features that are supported based upon SQL versions and database compatibility level.

RecursoFeature SQL Server Integration ServicesSQL Server Integration Services Nível de compatibilidade 100 ou superior do SQL ServerSQL Server compatibility level 100 or higher Nível de compatibilidade 90 do SQL Server 2008 ou posterior.SQL Server 2008 or later with compatibility level 90.
Agregações de DISTINCTDISTINCT aggregates Não há suporte para WITH CUBE ou WITH ROLLUP.Not supported for WITH CUBE or WITH ROLLUP. Há suporte para WITH CUBE, WITH ROLLUP, GROUPING SETS, CUBE ou ROLLUP.Supported for WITH CUBE, WITH ROLLUP, GROUPING SETS, CUBE, or ROLLUP. Igual ao nível de compatibilidade 100.Same as compatibility level 100.
Função definida pelo usuário com nome CUBE ou ROLLUP na cláusula GROUP BYUser-defined function with CUBE or ROLLUP name in the GROUP BY clause A função definida pelo usuário dbo.cube(arg1,...argN) ou dbo.rollup(arg1,...argN) na cláusula GROUP BY é permitida.User-defined function dbo.cube(arg1,...argN) or dbo.rollup(arg1,...argN) in the GROUP BY clause is allowed.

Por exemplo: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);For example: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
A função definida pelo usuário dbo.cube (arg1,...argN ) ou dbo.rollup( arg1 ,...argN) na cláusula GROUP BY não é permitida.User-defined function dbo.cube (arg1,...argN ) or dbo.rollup( arg1 ,...argN) in the GROUP BY clause is not allowed.

Por exemplo: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);For example: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);

A mensagem de erro a seguir será retornada: "Sintaxe incorreta próxima à palavra-chave 'cube'|'rollup."The following error message is returned: "Incorrect syntax near the keyword 'cube'|'rollup'."

Para evitar esse problema, substitua dbo.cube por [dbo].[cube] ou dbo.rollup por [dbo].[rollup].To avoid this problem, replace dbo.cube with [dbo].[cube] or dbo.rollup with [dbo].[rollup].

O exemplo a seguir é permitido: 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);
A função definida pelo usuário dbo.cube (arg1,...argN) ou dbo.rollup(arg1,...argN) na cláusula GROUP BY é permitidaUser-defined function dbo.cube (arg1,...argN) or dbo.rollup(arg1,...argN) in the GROUP BY clause is allowed

Por exemplo: 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 Sem suporteNot supported Tem suporteSupported Tem suporteSupported
CUBECUBE Sem suporteNot supported Tem suporteSupported Sem suporteNot supported
ROLLUPROLLUP Sem suporteNot supported Tem suporteSupported Sem suporteNot supported
Total geral, como GROUP BY ()Grand total, such as GROUP BY () Sem suporteNot supported Tem suporteSupported Tem suporteSupported
Função GROUPING_IDGROUPING_ID function Sem suporteNot supported Tem suporteSupported Tem suporteSupported
função GROUPINGGROUPING function Tem suporteSupported Tem suporteSupported Tem suporteSupported
WITH CUBEWITH CUBE Tem suporteSupported Tem suporteSupported Tem suporteSupported
WITH ROLLUPWITH ROLLUP Tem suporteSupported Tem suporteSupported Tem suporteSupported
Remoção de agrupamento "duplicado" WITH CUBE ou WITH ROLLUPWITH CUBE or WITH ROLLUP "duplicate" grouping removal Tem suporteSupported Tem suporteSupported Tem suporteSupported

ExemplosExamples

A.A. Usar uma cláusula GROUP BY simplesUse a simple GROUP BY clause

O exemplo a seguir recupera o total para cada tabela SalesOrderID da tabela SalesOrderDetail.The following example retrieves the total for each SalesOrderID from the SalesOrderDetail table. Este exemplo usa o AdventureWorks.This example uses AdventureWorks.

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

b.B. Usar uma cláusula GROUP BY com várias tabelasUse a GROUP BY clause with multiple tables

O exemplo a seguir recupera o número de funcionários de cada City da tabela Address unida à tabela EmployeeAddress.The following example retrieves the number of employees for each City from the Address table joined to the EmployeeAddress table. Este exemplo usa o 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.C. Usar uma cláusula GROUP BY com uma expressãoUse a GROUP BY clause with an expression

O exemplo a seguir recupera as vendas totais durante cada ano usando a função DATEPART.The following example retrieves the total sales for each year by using the DATEPART function. A mesma expressão deve estar presente na lista SELECT e na cláusula 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.D. Usar uma cláusula GROUP BY com uma cláusula HAVINGUse a GROUP BY clause with a HAVING clause

O exemplo a seguir usa a cláusula HAVING para especificar quais dos grupos gerados na cláusula GROUP BY devem ser incluídos no conjunto de resultados.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);  

Exemplos: SQL Data Warehouse e Parallel Data WarehouseExamples: SQL Data Warehouse and Parallel Data Warehouse

E.E. Uso básico da cláusula GROUP BYBasic use of the GROUP BY clause

O exemplo a seguir localiza a quantidade total de todas as vendas em cada dia.The following example finds the total amount for all sales on each day. Uma linha que contém a soma de todas as vendas é retornada para cada dia.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.F. Uso básico da dica de DISTRIBUTED_AGGBasic use of the DISTRIBUTED_AGG hint

Este exemplo usa a dica de consulta DISTRIBUTED_AGG para forçar o dispositivo a embaralhar a tabela na coluna CustomerKey antes de executar a agregação.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.G. Variações de sintaxe para GROUP BYSyntax Variations for GROUP BY

Quando a lista de seleção não tem nenhuma agregação, cada coluna na lista de seleção precisa ser incluída na lista GROUP BY.When the select list has no aggregations, each column in the select list must be included in the GROUP BY list. As colunas computadas na lista de seleção podem ser listadas, mas não são obrigatórias na lista GROUP BY.Computed columns in the select list can be listed, but are not required, in the GROUP BY list. Estes são exemplos de instruções SELECT sintaticamente válidas: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.H. Usando um GROUP BY com várias expressões GROUP BYUsing a GROUP BY with multiple GROUP BY expressions

O exemplo a seguir agrupa os resultados usando vários critérios de GROUP BY.The following example groups results using multiple GROUP BY criteria. Se dentro de cada grupo OrderDateKey houver subgrupos que possam ser diferenciados pela DueDateKey, um novo agrupamento será definido para o conjunto de resultados.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.I. Usando uma cláusula GROUP BY com uma cláusula HAVINGUsing a GROUP BY clause with a HAVING clause

O exemplo a seguir usa a cláusula HAVING para especificar os grupos gerados na cláusula GROUP BY que devem ser incluídos no conjunto de resultados.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. Somente os grupos com datas de pedido de 2004 ou posteriores serão incluídos nos resultados.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;  

Consulte TambémSee Also

GROUPING_ID (Transact-SQL) GROUPING_ID (Transact-SQL)
GROUPING (Transact-SQL) GROUPING (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
Cláusula SELECT (Transact-SQL)SELECT Clause (Transact-SQL)