Partilhar via


GROUP BY (Entidade SQL)

Especifica os grupos nos quais os objetos retornados por uma expressão de consulta (SELECT) devem ser colocados.

Sintaxe

[ GROUP BY aliasedExpression [ ,...n ] ]

Argumentos

aliasedExpression Qualquer expressão de consulta válida na qual o agrupamento é executado. expression pode ser uma propriedade ou uma expressão não agregada que faz referência a uma propriedade retornada pela cláusula FROM. Cada expressão em uma cláusula GROUP BY deve ser avaliada para um tipo que possa ser comparado para igualdade. Esses tipos são geralmente primitivos escalares, como números, cadeias de caracteres e datas. Não é possível agrupar por uma coleção.

Observações

Se as funções agregadas forem incluídas na lista> de seleção da cláusula <SELECT, GROUP BY calculará um valor de resumo para cada grupo. Quando GROUP BY é especificado, cada nome de propriedade em qualquer expressão não agregada na lista select deve ser incluído na lista GROUP BY ou a expressão GROUP BY deve corresponder exatamente à expressão select list.

Nota

Se a cláusula ORDER BY não for especificada, os grupos retornados pela cláusula GROUP BY não estarão em nenhuma ordem específica. Para especificar uma ordenação específica dos dados, recomendamos que você sempre use a cláusula ORDER BY.

Quando uma cláusula GROUP BY é especificada, explícita ou implicitamente (por exemplo, por uma cláusula HAVING na consulta), o escopo atual fica oculto e um novo escopo é introduzido.

A cláusula SELECT, a cláusula HAVING e a cláusula ORDER BY não poderão mais se referir a nomes de elementos especificados na cláusula FROM. Você só pode se referir às próprias expressões de agrupamento. Para fazer isso, você pode atribuir novos nomes (aliases) a cada expressão de agrupamento. Se nenhum alias for especificado para uma expressão de agrupamento, o Entity SQL tentará gerar um usando as regras de geração de alias, conforme ilustrado no exemplo a seguir.

SELECT g1, g2, ...gn FROM c as c1

GROUP BY e1 as g1, e2 as g2, ...en as gn

As expressões na cláusula GROUP BY não podem referir-se a nomes definidos anteriormente na mesma cláusula GROUP BY.

Além de agrupar nomes, você também pode especificar agregações na cláusula SELECT, na cláusula HAVING e na cláusula ORDER BY. Uma agregação contém uma expressão que é avaliada para cada elemento do grupo. O operador agregado reduz os valores de todas essas expressões (normalmente, mas nem sempre, em um único valor). A expressão agregada pode tornar visíveis referências aos nomes dos elementos originais no escopo pai ou a qualquer um dos novos nomes introduzidos pela própria cláusula GROUP BY. Embora os agregados apareçam na cláusula SELECT, na cláusula HAVING e na cláusula ORDER BY, eles são realmente avaliados sob o mesmo escopo que as expressões de agrupamento, conforme ilustrado no exemplo a seguir.

SELECT name, sum(o.Price * o.Quantity) as total

FROM orderLines as o

GROUP BY o.Product as name

Esta consulta utiliza a cláusula GROUP BY para produzir um relatório do custo de todos os produtos encomendados, discriminados por produto. Ele dá o nome name ao produto como parte da expressão de agrupamento e, em seguida, faz referência a esse nome na lista SELECT. Ele também especifica a agregação sum na lista SELECT que faz referência interna ao preço e à quantidade da linha do pedido.

Cada expressão de chave GROUP By deve ter pelo menos uma referência ao escopo de entrada:

SELECT FROM Persons as P
GROUP BY Q + P   -- GOOD
GROUP BY Q   -- BAD
GROUP BY 1   -- BAD, a constant is not allowed

Para obter um exemplo de uso de GROUP BY, consulte HAVING.

Exemplo

A consulta Entity SQL a seguir usa o operador GROUP BY para especificar grupos nos quais os objetos são retornados por uma consulta. A consulta é baseada no Modelo de Vendas AdventureWorks. Para compilar e executar esta consulta, siga estes passos:

  1. Siga o procedimento em Como: Executar uma consulta que retorna resultados PrimitiveType.

  2. Passe a seguinte consulta como um argumento para o ExecutePrimitiveTypeQuery método:

SELECT VALUE name FROM AdventureWorksEntities.Products 
    AS P GROUP BY P.Name HAVING MAX(P.ListPrice) > @price

Consulte também