AGRUPAR POR (Entity SQL)

Especifica os grupos na qual 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 em que o agrupamento for executado. expression pode ser uma propriedade ou uma expressão de não agregação que referencia uma propriedade retornada pela cláusula. Cada expressão em um cláusula GROUP BY deve ser avaliada como um tipo que pode ser comparado para igualdade. Esses tipos são geralmente primitivos escalares como números, cadeias de caracteres, e datas. Você não pode agrupar por uma coleção.

Comentários

Se as funções agregadas são incluídas na <lista select> da cláusula SELECT, GROUP BY calcula um valor de resumo para cada grupo. Quando o GRUPO é especificado PERTO, ou cada nome de propriedade em qualquer expressão de nonaggregate na lista select deve ser incluído na lista GRUPO, ou o GROUP BY expressão deve coincidir exatamente com a expressão selecionar a lista.

Observação

Se a cláusula ORDER BY não for especificado, os grupos retornados pelo cláusula GROUP BY não estão em qualquer ordem específica. Para especificar ordem específica de dados, nós recomendamos que você sempre use a cláusula ORDER BY.

Quando um cláusula GROUP BY é especificado, explícita ou implicitamente (por exemplo, a cláusula HAVING na consulta), o escopo atual está oculto, e um novo escopo é apresentado.

A cláusula SELECT, a cláusula HAVING, e a cláusula GROUP BY não poderão consultar os nomes de elemento especificado na cláusula. Você só pode usar expressões elas mesmas de agrupamento. Para fazer isso, você pode atribuir novos nomes (alias) para cada expressão de agrupamento. Se nenhum alias for especificada para uma expressão de agrupamento, o Entity SQL tenta 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 em cláusula GROUP BY não podem referir-se nomes definidos anteriormente no mesmo cláusula GROUP BY.

Além de nomes de agrupamento, você também pode especificar agregados na cláusula SELECT, TENDO a cláusula, e a cláusula GROUP BY. Uma agregação contém uma expressão que é avaliada para cada elemento de grupo. O operador aggregate reduz os valores de todas essas expressões (normalmente, mas nem sempre, em um único valor.) A expressão aggregate pode fazer referências aos nomes de elementos visíveis originais no escopo pai, ou a alguns dos novos nomes introduzidos por cláusula GROUP BY próprio. Embora as agregações apareçam na cláusula SELECT, TENDO a cláusula, e a cláusula GROUP BY, são avaliadas realmente 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

Esta consulta usa o cláusula GROUP BY para gerar um relatório de custo de todos os produtos ordenados, subproduto dividido. Ela dá o nome de name ao produto como parte de uma expressão de agrupamento, e faz referência a esse nome na lista SELECT. Ela também especifica a sum agregada na lista SELECT que referencia internamente e o preço a quantidade da linha do pedido.

Cada GROUP BY expressão chave 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, confira HAVING.

Exemplo

A seguinte consulta SQL Entity usa o GRUPO pelo operador para especificar os grupos em que 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 Como executar uma consulta que retorna os resultados de PrimitiveType.

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

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

Confira também