sql --使用 GROUP BY 分组行

来源:互联网 发布:淘宝怎么看总消费 编辑:程序博客网 时间:2024/05/29 07:05

转自:http://msdn.microsoft.com/zh-cn/library/ms189288(v=sql.90).aspx

GROUP BY 子句用来为结果集中的每一行产生聚合值。如果聚合函数没有使用 GROUP BY 子句,则只为 SELECT 语句报告一个聚合值。

下面的示例查找数据库中各销售订单的总额。

USE AdventureWorks;
GO
SELECT SalesOrderID, SUM(LineTotal)
 AS SubTotalFROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;
GO

GROUP BY 关键字后跟一个列的列表,称为组合列。GROUP BY 子句限制结果集中的行数,每个不同的值在组合列中只占一行。每个结果集行都包含与其组合列中的特定值相关的汇总数据。

当 SELECT 语句中包含 GROUP BY 关键字时,对可以在选择列表中指定的项目有一些限制。选择列表中允许的项目是:

  • 组合列。
  • 为组合列中的每个值只返回一个值的表达式,例如将列名作为其参数之一的聚合函数。这些函数称为矢量聚合。

例如,TableX 包含:

ColumnAColumnBColumnC

-------

-------

-------

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 SumCFROM TableXGROUP BY ColumnA

此选择语句返回两行,为 ColumnA 中的每个唯一值各返回一行:

ColumnA MaxB SumC ----------- ---- ----------- 1 ghi 18 2 mno 11 (2 row(s) affected)

但是,选择列表中不能只包含 ColumnB 表达式:

SELECT ColumnA, ColumnB, SUM(ColumnC) AS SumCFROM TableXGROUP BY ColumnA

由于 GROUP BY 只能返回一行,该行在 ColumnA 中的值为 1,因此无法返回与 ColumnA 中的值 1 关联的 ColumnB 中的三个值(abc、def 和 ghi)。

不能对 ntexttextimage 或 bit 列使用 GROUP BY 或 HAVING,除非它们所在的函数返回的值属于其他数据类型。这样的函数包括 SUBSTRING 和 CAST。

原创粉丝点击