Cláusula GROUP BY do SQL Server
- 14-09-2022
- Toanngo92
- 0 Comments
Mục lục
Cláusula Agrupar por .
A cláusula GROUP BY divide o conjunto de resultados em um ou mais subconjuntos. Cada subconjunto possui valores e expressões comuns. A palavra-chave GROUP BY é seguida por uma lista de colunas, chamada de coluna agrupada . Cada coluna agrupada restringe o número de linhas do conjunto de resultados. Para cada coluna agrupada, há apenas uma linha. A cláusula GROUP BY pode ter mais de uma coluna agrupada.
Sintaxe:
SELECT select_list FROM table_name GROUP BY column_name1,column_name2, ... ;
Considere o cenário da tabela WorkOrderRouting em AdventureWorks2019 . O total de horas de recursos para cada ordem de serviço deve ser calculado. Para isso, os registros devem ser agrupados pelo número da ordem de serviço, que é a coluna WorkOrderID
O exemplo abaixo recupera e exibe o total de horas de recursos para cada ordem de serviço junto com o número da ordem de serviço. Nesta consulta, uma função interna chamada SUM() é usada para calcular a soma. SUM() é uma função que soma os registros de uma coluna.
SELECT WorkOrderID,SUM(ActualResourceHrs) AS TotalHoursPerWorkOrder FROM Production.WorkOrderRouting GROUP BY WorkOrderID
A instrução execute retornará todos os WorkOrders e o total de horas de recursos.
A cláusula GROUP BY também pode ser usada em conjunto com outras cláusulas, como:
Agrupar por com ONDE
A cláusula WHERE pode ser usada com a cláusula GROUP BY para restringir linhas para agrupamento de dados. As linhas que atendem aos critérios de pesquisa serão consideradas para reagrupamento. As linhas que não atendem aos critérios de pesquisa serão removidas antes que o processo de agrupamento seja concluído.
Por exemplo:
SELECt WorkOrderID,SUM(ActualResourceHrs) AS TotalHoursPerWorkOrder FROM Production.WorkOrderRouting WHERE WorkOrderID < 50 GROUP BY WorkOrderID
GROUP BY com NULL
Se a coluna do grupo contiver nulo, a linha se tornará um grupo separado no conjunto de resultados. Se a coluna do grupo contiver mais de um valor NULL, os valores NULL serão incluídos em uma única linha. Considere a tabela Production.Product . Existem algumas linhas em que há um valor NULL na coluna Class .
Usar GROUP BY para uma consulta de tabela também usará valores NULL. Por exemplo, o código abaixo recupera e exibe o preço médio do preço de tabela para cada Classe
SELECT Class, AVG(ListPrice) AS 'AverageListPrice' FROM Production.Product GROUP BY Class
Agrupar por com TODOS
A palavra-chave ALL pode ser usada com a cláusula GROUP BY. Só faz sentido quando o SELECT tem uma cláusula WHERE. Quando ALL é usado, inclui todos os grupos que a cláusula GROUP BY cria. Inclui até grupos que não atendem às condições de pesquisa.
Sintaxe:
SELECT <column_name> FROM <table_name> WHERE <condition> GROUP BY ALL <column_name>
Considere a tabela Sales.SalesTerritory, que possui uma coluna denominada Group que indica a localização coordenada da área de vendas. O código abaixo irá calcular e exibir o total de vendas para cada grupo. A saída precisa mostrar todos os grupos, independentemente de terem ou não vendas. Para conseguir isso, o código usa GROUP BY com ALL
SELECT [Group], SUM(SalesYTD) AS 'TotalSales' FROM Sales.SalesTerritory WHERE [Group] LIKE 'N%' OR [Group] LIKE 'E%' GROUP BY ALL [Group]
GROUP BY com HAVING
A cláusula HAVING é usada com a instrução SELECT para especificar uma condição de pesquisa para um grupo. A cláusula HAVING atua como uma cláusula WHERE em locais onde a cláusula WHERE não pode ser usada em funções agregadas como SUM(). Depois de criar grupos com a cláusula GROUP BY, convém filtrar ainda mais os resultados. A cláusula HAVING atua como um filtro nas linhas, semelhante a como a cláusula WHERE atua como um filtro nas linhas retornadas pela cláusula FROM.
Sintaxe:
SELECT <column_name> FROM <table_name> GROUP BY <column_name> HAVING <search_condition>
Por exemplo:
SELECT [Group],SUM(SalesYTD) AS 'TotalSales' FROM Sales.SalesTerritory WHERE [Group] LIKE 'P%' GROUP BY ALL [Group] HAVING SUM (SalesYTD) < 6000000
Resumindo dados
A cláusula GROUP BY também usa os operadores CUBE e ROLLUP para retornar dados de resumo. O número de colunas na cláusula GROUP BY determina o número de linhas de resumo no conjunto de resultados. Os operadores são descritos a seguir:
CUBO
CUBE é o operador agregado que gera uma linha super agregada. Além das linhas regulares fornecidas pelo GROUP BY, ele também fornece um resumo das linhas que a cláusula GROUP BY produz.
A linha de resumo exibida para cada combinação possível de grupos é o conjunto de resultados. A linha Resumo mostra NULL no conjunto de resultados, mas retorna todos os valores para aqueles ao mesmo tempo.
Sintaxe:
SELECT <column_name> FROM <table_name> GROUP BY <column_name> WITH CUBE
Por exemplo:
O serviço mostra o total de vendas para cada país, excluindo Austrália e Canadá
SELECT Name, CountryRegionCode, SUM(SalesYTD) AS TotalSales FROM Sales.SalesTerritory WHERE Name <> 'Australia' AND Name <> 'Canada' GROUP BY Name,CountryRegionCode WITH CUBE
CUBE é como uma extensão da cláusula GROUP BY. CUBE permite que você subtotal para todas as combinações de colunas do grupo especificadas na cláusula GROUP BY.
ROLAR
Além das linhas regulares geradas pelo GROUP BY, ele também injeta linhas de resumo no conjunto de resultados. É semelhante ao operador CUBE, mas produz um conjunto de resultados que exibe os grupos em ordem hierárquica. Ele classifica os grupos do menor para o maior. A hierarquia de agrupamento nos resultados depende da ordem em que as colunas agrupadas são especificadas
Sintaxe:
SELECT <column_name1>[,<column_name2>] FROM <table_name> GROUP BY < WITH ROLLUP
Por exemplo:
SELECT [Name], SUM(SalesYTD) AS TotalSales FROM Sales.SalesTerritory GROUP BY [Name] WITH ROLLUP