GROUPING SETS: 根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL 数据准备:
建表语句: create table tmp.gb( a string, b string, c int )row format delimited fields terminated by '\t' stored as textfile; 案例数据: 1 1 1 2 1 2 2 2 2 2 2 3 2 1 2 1 2 2
使用案例:
第一种组合: select a,b,sum(c) from gb group by a,b grouping sets(a); 1 NULL 3 2 NULL 9 第二种组合: select a,b,sum(c) from gb group by a,b grouping sets(b); NULL 1 5 NULL 2 7 第三种组合: select a,b,sum(c) from gb group by a,b grouping sets(a,b); NULL 1 5 NULL 2 7 1 NULL 3 2 NULL 9 第四种组合: select a,b,sum(c) from gb group by a,b grouping sets((a,b)); 1 1 1 1 2 2 2 1 4 2 2 5 第五种组合: select a,b,sum(c) from gb group by a,b grouping sets((a,b),a); 1 NULL 3 1 1 1 1 2 2 2 NULL 9 2 1 4 2 2 5 特殊组合: select a,b,sum(c) from gb group by a,b; 1 1 1 1 2 2 2 1 4 2 2 5 通过案例演示,发现grouping sets是可以细化到每一种组合,不同的组合可以通过其他的组合进行union实现,其中直接使用group by 和使用grouping sets((a,b))效果是一致的,可以理解为group by是grouping sets的其中一个组合。
创建表:
CREATE TABLE DEPART (部门 char(10),员工 char(6),工资 int) INSERT INTO DEPART SELECT 'A','ZHANG',100 INSERT INTO DEPART SELECT 'A','LI',200 INSERT INTO DEPART SELECT 'A','WANG',300 INSERT INTO DEPART SELECT 'A','ZHAO',400 INSERT INTO DEPART SELECT 'A','DUAN',500 INSERT INTO DEPART SELECT 'B','DUAN',600 INSERT INTO DEPART SELECT 'B','DUAN',700 部门 员工 工资 A ZHANG 100 A LI 200 A WANG 300 A ZHAO 400 A DUAN 500 B DUAN 600 B DUAN 700
ROLLUP演示
SELECT 部门,员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY 部门,员工 WITH ROLLUP;
结果如下: A DUAN 500 A LI 200 A WANG 300 A ZHANG 100 A ZHAO 400 A NULL 1500 B DUAN 1300 B NULL 1300 NULL NULL 2800
ROLLUP结果集中多了三条汇总信息:即部门A的合计,部门B的合计以及总合计。其中将部门B中的DUAN合计。等价于下列SQL语句
SELECT 部门,员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY 部门,员工 union SELECT 部门,'NULL',SUM(工资)AS TOTAL FROM DEPART GROUP BY 部门 union SELECT 'NULL','NULL',SUM(工资)AS TOTAL FROM DEPART 结果: A DUAN 500 A LI 200 A NULL 1500 A WANG 300 A ZHANG 100 A ZHAO 400 B DUAN 1300 B NULL 1300 NULL NULL 2800
CUBE演示
SELECT 部门,员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY 部门,员工 WITH CUBE 结果: A DUAN 500 A LI 200 A WANG 300 A ZHANG 100 A ZHAO 400 A NULL 1500 B DUAN 1300 B NULL 1300 NULL NULL 2800 NULL DUAN 1800 NULL LI 200 NULL WANG 300 NULL ZHANG 100 NULL ZHAO 400
CUBE的结果集是在 ROLLUP结果集的基础上多了5行,这5行相当于在ROLLUP结果集上在union 上以员工 (即CUBE)为 GROUP BY的结果。
等价于下列的SQL语句:
SELECT 部门,员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY 部门,员工 WITH ROLLUP union SELECT 'NULL',员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY 员工 结果: NULL NULL 2800 A NULL 1500 A DUAN 500 A LI 200 A WANG 300 A ZHANG 100 A ZHAO 400 B NULL 1300 B DUAN 1300 NULL DUAN 1800 NULL LI 200 NULL WANG 300 NULL ZHANG 100 NULL ZHAO 400
