GROUP BY 子句可以包括 GROUPING SETS、CUBE、ROLLUP、WITH CUBE 或 WITH ROLLUP等从属子句,从而为 SELECT 子句 <select> 列表中的聚合函数提供有关每个组(而不是各行)的信息。
更多详细信息,请参考 http://technet.microsoft.com/zh-cn/library/ms177673.aspx
WITH CUBE 或 WITH ROLLUP 等从属子句不符合 ISO 规范,因此后续版本 SQL Server 将删除该功能。请避免在新的开发工作中使用该功能。
一、ROLLUP 从属子句
1. 语法
ROLLUP 从属子句生成简单的 GROUP BY 聚合行以及小计行或超聚合行,还生成一个总计行。
返回的分组数等于<composite element list>中的表达式数加一。
2. 示例
下面的语句会为 (a, b, c)、(a, b) 和 (a) 值的每个唯一组合生成一个带有小计的行。 还将计算一个总计行。
列是按照从右到左的顺序汇总的。 列的顺序会影响 ROLLUP 的输出分组,而且可能会影响结果集内的行数。
SELECT a, b, c, SUM ( <expression> ) FROM T GROUP BY ROLLUP (a,b,c); |
二、CUBE 从属子句
1. 语法
生成简单的 GROUP BY 聚合行、ROLLUP 超聚合行和交叉表格行。
CUBE 针对 <composite element list> 中表达式的所有排列输出一个分组。
生成的分组数等于 (2n),其中 n = <composite element list> 中的表达式数。
2. 示例
下面的语句会为 (a, b, c)、(a, b)、(a, c)、(b, c)、(a)、(b) 和 (c) 值的每个唯一组合生成一个带有小计的行,还会生成一个总计行。
列的顺序不影响 CUBE 的输出。
SELECT a, b, c, SUM (<expression>) FROM T GROUP BY CUBE (a,b,c); |
三、GROUPING SETS 从属子句
1. 语法
在一个查询中指定数据的多个分组。 仅聚合指定组,而不聚合由 CUBE 或 ROLLUP 生成的整组聚合。 其结果与针对指定的组执行 UNION ALL 运算等效。
GROUPING SETS 可以包含单个元素或元素列表。GROUPING SETS 可以指定与 ROLLUP 或 CUBE 返回的内容等效的分组。<grouping set item list> 可以包含 ROLLUP 或 CUBE。
2. 示例
下面的语句会为 (a,b) 和 (c) 值的每个分组集生成一个带有小计的行。还将计算一个总计行。
SELECT a, b, SUM (<expression>) FROM T GROUP BY GROUPING SETS ( (a,b) (c) () ); |
上例相当于:
SELECT a, b, SUM (<expression>) FROM T GROUP BY a,b UNION ALL SELECT NULL, NULL, SUM (<expression>) FROM T GROUP BY c UNION ALL SELECT NULL, NULL, SUM (<expression>) FROM T |