Compartilhar via


GROUP BY (Entity SQL)

Especifica os grupos nos quais os objetos retornados por uma expressão SELECT (consulta) 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 como um tipo que pode ser comparado quanto à igualdade. Esses tipos geralmente são primitivos escalares, como números, cadeias de caracteres e datas. Você não pode agrupar por uma coleção.

Observações

Se as funções de agregação 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 de entrada na lista de seleção deve ser incluído na lista GROUP BY ou a expressão GROUP BY deve corresponder exatamente à expressão de lista selecionada.

Observação

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, explicitamente 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 aos 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 SQL da Entidade 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

Expressões na cláusula GROUP BY não podem se referir 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, 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 de agregação reduz os valores de todas essas expressões (geralmente, mas nem sempre, em um único valor). A expressão de agregação pode fazer referências aos nomes de elementos originais visíveis no escopo pai ou a qualquer um dos novos nomes introduzidos pela própria cláusula GROUP BY. Embora as agregações apareçam na cláusula SELECT, cláusula HAVING e cláusula ORDER BY, elas são avaliadas no 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

Essa consulta usa a cláusula GROUP BY para produzir um relatório do custo de todos os produtos ordenados, divididos por produto. Ele fornece o nome name para o 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 de pedido.

Cada expressão GROUP By key 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 como usar GROUP BY, consulte HAVING.

Exemplo

A consulta SQL de entidade 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 essa consulta, siga estas etapas:

  1. Siga o procedimento em How to: Execute a Query that Returns PrimitiveType Results.

  2. Passe a consulta a seguir 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