GROUP BY (Entity SQL)
指定由查询 (SELECT) 表达式返回的对象要分入的组。
[ GROUP BY aliasedExpression [ ,...n ] ]
- aliasedExpression
要对其执行分组的任何有效查询表达式。expression 可以是属性或者是引用 FROM 子句所返回的属性的非聚合表达式。GROUP BY 子句中的每一个表达式的求值结果必须为可比较相等性的类型。这些类型通常为标量基元类型,如数字、字符串和日期。不可按集合分组。
如果 SELECT 子句 <select list> 中包含聚合函数,则 GROUP BY 将计算每个组的汇总值。指定 GROUP BY 时,选择列表中任何非聚合表达式内的每个属性名都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。
注意 |
---|
如果未指定 ORDER BY 子句,则使用 GROUP BY 子句返回的组没有任何特定的顺序。若要指定特定的数据排序,建议始终使用 ORDER BY 子句。 |
指定 GROUP BY 子句时,无论是显式指定还是隐式指定(例如,通过查询中的 HAVING 子句指定),当前作用域都将隐藏,并且将引入新的作用域。
SELECT 子句、HAVING 子句和 ORDER BY 子句将无法再引用 FROM 子句中指定的元素名。您只能引用分组表达式本身。为此,可以为每个分组表达式指定新的名称(别名)。如果没有为分组表达式指定别名,Entity SQL 将尝试使用别名生成规则来生成别名,如下例中所示。
SELECT g1, g2, ...gn FROM c as c1
GROUP BY e1 as g1, e2 as g2, ...en as gn
GROUP BY 子句中的表达式无法引用先前在相同 GROUP BY 子句中定义的名称。
除了分组名称外,还可以在 SELECT 子句、HAVING 子句和 ORDER BY 子句中指定聚合。聚合中包含的表达式针对组中的每一个元素进行求值。聚合运算符缩减所有这些表达式的值(通常,但非总是,缩减为单个值)。聚合表达式可以引用父作用域中可见的原始元素名,或者引用 GROUP BY 子句本身引入的任何新名称。虽然聚合出现在 SELECT 子句、HAVING 子句和 ORDER BY 子句中,但是实际上它们是在与分组表达式相同的作用域中求值的,如下面的示例中所示。
SELECT name, sum(o.Price * o.Quantity) as total
FROM orderLines as o
GROUP BY o.Product as name
此查询使用 GROUP BY 子句生成所有已订购产品的成本报表,并按产品细分。它在分组表达式中为产品指定名称 name
,然后在 SELECT 列表中引用该名称。它还在 SELECT 列表中指定聚合 sum
,该聚合在内部引用订单行的价格和数量。
每一个 GROUP By 键表达式必须至少有一个对输入作用域的引用:
SELECT FROM Persons as P
GROUP BY Q + P -- GOOD
GROUP BY Q -- BAD
GROUP BY 1 -- BAD, a constant is not allowed
有关使用 GROUP BY 的示例,请参见 HAVING (Entity SQL)。
下面的 Entity SQL 查询使用 GROUP BY 运算符来指定查询所返回的对象的分组。此查询基于 AdventureWorks 销售模型。若要编译并运行此查询,请执行下列步骤:
将以下查询作为参数传递给
ExecutePrimitiveTypeQuery
方法:
SELECT VALUE name FROM AdventureWorksEntities.Product
as P GROUP BY P.Name HAVING MAX(P.ListPrice) > 5
输出如下所示:
Value: LL Mountain Seat Assembly
Value: ML Mountain Seat Assembly
Value: HL Mountain Seat Assembly
Value: LL Road Seat Assembly
Value: ML Road Seat Assembly