GROUP BY 子句用来为结果集中的每一行产生聚合值。如果聚合函数没有使用 GROUP BY 子句,则只为 SELECT 语句报告一个聚合值。
下面的示例查找数据库中各销售订单的总额。
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;
GO
GROUP BY 关键字后跟一个列的列表,称为组合列。GROUP BY 子句限制结果集中的行数,每个不同的值在组合列中只占一行。每个结果集行都包含与其组合列中的特定值相关的汇总数据。
当 SELECT 语句中包含 GROUP BY 关键字时,对可以在选择列表中指定的项目有一些限制。选择列表中允许的项目是:
- 组合列。
- 为组合列中的每个值只返回一个值的表达式,例如将列名作为其参数之一的聚合函数。这些函数称为矢量聚合。
例如,TableX 包含:
ColumnA | ColumnB | ColumnC |
---|---|---|
------- | ------- | ------- |
1 | abc | 5 |
1 | def | 4 |
1 | ghi | 9 |
2 | jkl | 8 |
2 | mno | 3 |
如果 ColumnA 是组合列,则结果集中将有两行,其中一行汇总值 1 的信息,而另一行汇总值 2 的信息。
如果 ColumnA 是组合列,要引用 ColumnB 或 ColumnC,这两列必须是能为 ColumnA 中的每个值返回单个值的聚合函数中的参数。选择列表中可以包含诸如 MAX (ColumnB)、SUM (ColumnC) 或 AVG (ColumnC) 之类的表达式:
MAX(ColumnB) AS MaxB,
SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA
此选择语句返回两行,为 ColumnA 中的每个唯一值各返回一行:
ColumnA MaxB SumC ----------- ---- ----------- 1 ghi 18 2 mno 11 (2 row(s) affected)
但是,选择列表中不能只包含 ColumnB 表达式:
SELECT ColumnA, ColumnB, SUM(ColumnC) AS SumC FROM TableX GROUP BY ColumnA
由于 GROUP BY 只能返回一行,该行在 ColumnA 中的值为 1,因此无法返回与 ColumnA 中的值 1 关联的 ColumnB 中的三个值(abc、def 和 ghi)。
不能对 ntext、text、image 或 bit 列使用 GROUP BY 或 HAVING,除非它们所在的函数返回的值属于其他数据类型。这样的函数包括 SUBSTRING 和 CAST。