分组原理(GROUP BY子句)4:ROLLUP从属子句(常用于汇总)

分组原理(GROUP BY子句)4:ROLLUP从属子句(常用于汇总)

若觉得本文写得还可以,请多多关注本人所作书籍《C++语法详解》电子工业出版社出版,作者 黄勇,网盘地址:
https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg

本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)

五、ROLLUP从属子句(常用于汇总)
1、ROLLUP从属子句与CUBE从属子句类似,都是定义多个分组集的一种简便方法,只不过ROLLUP从属子句不是定义的输入列所组成的所有可能分组集(幂集),而只定义了幂集中的一个子集。使用ROLLUP进行汇总的实际应用,详见后文。
2、ROLLUP从属子句定义分组集的方式为:从右向左减少分组集所需分组列的数量,比如

ROLLUP (a, b, c, d)

与以下语句等效

 GROUPING SETS( (a, b, c, d), (a, b, c), (a, b) , ( a ) , () )

由此可见,ROLLUP指定的列的顺序不同所定义的分组集是不同的,比如ROLLUP(a, b),定义的分组集分别为(a, b),(a),(),而ROLLUP(b, a),定义的分组集分别为(b, a), (b),()
3、ROLLUP也可以使用多列定义分组集,即形如ROLLUP( (a, b), (c, d) )的形式,此时应把(a,b)看作一个整体,(c, d)看作一个整体,因此,等同于

GROUPING SETS ((a,b,c,d),(a,b), ())

因此,需要注意的是ROLLUP(a, b)与ROLLUP ( (a, b)) 是不同的,后者会把(a, b)看作一个整体进行分组。前者等同于GROUPING SETS( (a, b), (a), () ),后者等同于GROUING SETS( (a, b), () )
4、在同一个GROUP BY子句中,也可以使用逗号分隔的多个ROLLUP子句,比如,

GROUP BY ROLLUP(a, b), ROLLUP(c, d)	
GROUP BY GROUPING SETS( ROLLUP(a, b), ROLLUP(c, d, e));

该语句的规则,详见后文。

示例5.06:ROLLUP从属子句原理(输出结果见图XXX)
SELECT a,b,c,d FROM T4 GROUP BY ROLLUP (a,b,c,d) order by d,c,b,a	--语句1
SELECT a,b,c,d FROM T4 GROUP BY 						--语句2,等效于语句1
GROUPING SETS((a,b,c,d),(a,b,c),(a,b),(a),())order by d,c,b,a

在这里插入图片描述

作者:黄邦勇帅(原名:黄勇)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hyongilfmmm/article/details/93892672