实现按照不同级别分组统计
关于GROUP BY 中的GROUPING SETS,ROLLUP,CUBE 从需求的角度理解会更加容易些。
需求举例:
假如一所学校只有两个系,
每个系有两个专业,
每个专业有两个班,
须在需要一张按照不同级别统计学生人数的报表
例如:
系别 | 专业 | 班级 | 学生人数 |
1系 | |||
专业1 | |||
班级1 | |||
班级2 | |||
专业2 | |||
班级1 | |||
班级2 | |||
2系 | |||
专业1 | |||
班级1 | |||
班级2 | |||
专业2 | |||
班级1 | |||
班级2 |
首先想到的方法就是,按照不同界别去GROUP BY 然后union到一起,
而GROUPING SETS,ROLLUP,CUBE就类似的实现了这种功能,使编码更简洁。
- GROUPING sets
1, GROUPING sets(1,2)等效于
SELECT 1,COUNT FROM dummy GROUP BY 1
UNION ALL
SELECT 2,COUNT FROM dummy GROUP BY 2
- ROLLUP
2, ROLLUP(1,2,3)等效于
GROUPING SETS(
(1,2,3),
(1,2),
1,
()
)
- CUBE
3, CUBE(1,2,3)等效于
GROUPING SETS(
(1,2,3),
(1,2),
(1,3),
(2,3),
1,
2,
3,
()
)
---------------------------华丽的分割线------------------------------
举了一个简单的例子:
执行结果如下: