GROUP BY 子句用来为结果集中的每一行产生聚合值。如果聚合函数没有使用 GROUP BY 子句,则只为 SELECT 语句报告一个聚合值。
下面的示例查找数据库中各销售订单的总额。
USE AdventureWorks;
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) 之类的表达式:
SELECT ColumnA,
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。
其他资源
CAST 和 CONVERT (Transact-SQL)
SUBSTRING (Transact-SQL)
SELECT (Transact-SQL)
帮助和信息
获取 SQL Server 2005 帮助