GROUP BY (实体 SQL)

指定要放置查询 (SELECT) 表达式返回的对象的组。

语法

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

论据

aliasedExpression 对其执行分组的任何有效查询表达式。 expression 可以是引用 FROM 子句返回的属性或非聚合表达式。 GROUP BY 子句中的每个表达式都必须计算为可比较相等的类型。 这些类型通常是标量基元,如数字、字符串和日期。 不能按集合进行分组。

注解

如果 SELECT 子句 <选择列表中>包括聚合函数,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 查询使用 GROUP BY 运算符指定查询返回对象的组。 查询基于 AdventureWorks 销售模型。 若要编译并运行此查询,请执行以下步骤:

  1. 按照作方法中的过程作 :执行返回 PrimitiveType 结果的查询

  2. 将以下查询作为参数传递给 ExecutePrimitiveTypeQuery 方法:

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

另请参阅