1. SELECT语句顺序

groupby操作 - 图1 groupby操作 - 图2
注意:
1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
2.where肯定在group by 之前,即也在having之前。
3.where后的条件表达式里不允许使用聚合函数,而having可以。
4.having后只能跟group by后边字段条件 或者 非group by字段的聚合函数条件(按组查询)。

2. group by rollup

rollup:归纳,汇总

分组的种类数为:rollup后面的字段数 + 1
Group by rollup(A,B,C,D….)

1.group by null

2.group by A

3.group by A,B

4.group by A,B,C

5.group by A,B,C,D

  1. ….

ROLL UP 搭配 GROUP BY 使用,可以为每一个分组返回一个小计行,为所有分组返回一个总计行。

3. group by cube


Cube:多维数据集

分组的种类数为: 四种结果的并集
groupby操作 - 图3n为:cube括号里面的字段数

如:Group by rollup(A,B,C),首先会产生8个分组,分别为:
1.group by null,即,只统计数据,没有进行分组

2.group by A,即,只按照A进行分组
3.group by B,即,只按照B进行分组
4.group by C,即,只按照C进行分组

5.group by A,C,即,按照A,C进行分组

6.group by A,B,即,按照A,B进行分组

7.group by B,C,即,按照B,C进行分组

8.group by A,B,C,即,相当于没写cube

每一种分组的个数为:跟rollup相同

4. GROUPING

GROUPING()函数只能配合 ROLLUP 和 CUBE 使用,GROUPING()接收一列,如果此列不为空则返回0,如果为空则返回

5. GROUPING_ID()

GROUPING_ID()配合GROUPING()函数使用,GROUPING_ID(A,B)的值由GROUPING(A)与GROUPING(B)的值决定,如果GROUPING(A)为1,GROUPING(B)为0,则GROUPING_ID(A,B)的值为 10,十进制的 3.
有了GROUPING_ID列,我们就可以使用 HAVING 字句来对查询结果进行过滤。选择GROUPING_ID=0的就表示 FACTORY,DEPARTMENT两列都不为空。

6. group by grouping sets

Grouping sets:分组设置/集。
理解:先按照一定的规则产生多种分组,然后按照各组统计数据

分组的种类数为:grouping sets括号里面的字段数
Group by grouping sets(A,B,C,D….)
1.group by A
2.group by B
3.group by C
4.group by D
5. ….
每一组分组的种类数为:同rollup

案例

SELECT * FROM TEST_PRODUCTION;
image.png

(1) 单列分组

SELECT FACTORY,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY FACTORY;
image.png

SELECT FACTORY,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY ROLLUP(FACTORY);
image.png

SELECT FACTORY,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY CUBE(FACTORY);
image.png

备注:单列分组 ROLLUP与CUBE一样效果

(2) 两列分组

SELECT FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY ROLLUP(FACTORY, DEPARTMENT)
ORDER BY FACTORY
image.png
如果 ROLLUP(A,B)则先对 A,B进行 GROUP BY,之后对 A 进行 GROUP BY,最后对全表 GROUP BY。
如果 ROLLUP(A,B,C)则先对 A,B,C进行 GROUP BY ,然后对 A,B进行GROUP BY,再对 A 进行GROUP BY,最后对全表进行 GROUP BY.

SELECT FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY CUBE(FACTORY, DEPARTMENT)
ORDER BY FACTORY,DEPARTMENT
image.png
可以看出来首先对 FACTORY,DEPARTMENT进行分组汇总,然后对FACTORY 分组汇总,之后对 DEPARTMENT 分组汇总,最后有一行全表汇总。

SELECT GROUPING(FACTORY),FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY ROLLUP(FACTORY, DEPARTMENT)
ORDER BY FACTORY,DEPARTMENT
image.png

SELECT FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY GROUPING SETS(FACTORY, DEPARTMENT)
ORDER BY FACTORY,DEPARTMENT
image.png


SELECT GROUPING(FACTORY),GROUPING(DEPARTMENT),GROUPING_ID(FACTORY,DEPARTMENT),FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY ROLLUP(FACTORY, DEPARTMENT)
ORDER BY FACTORY,DEPARTMENT
image.png
————————————————
参考链接:
https://blog.csdn.net/the_best_hacker/article/details/92784204
https://blog.csdn.net/tom_tom_tom_xiang/article/details/78188617