今天我来讲一下Oracle中的Rollup分组函数。
首先我们创建一个测试表格
create table rollup_test(deptno int,name varchar2(20),salary number);
然后我们往里面插入几条记录
insert into rollup_test values (10,'AAA',1000);
insert into rollup_test values (10,'BBB',1000);
insert into rollup_test values (20,'CCC',2000);
insert into rollup_test values (20,'DDD',2000);
insert into rollup_test values (30,'EEE',3000);
insert into rollup_test values (30,'FFF',3000);
insert into rollup_test values (40,'GGG',4000);
insert into rollup_test values (40,'HHH',4000);
那么现在测试数据已经成功插入到表中。
接下来我们先看一下普通的分组,只用group by而不加rollup的效果
select deptno,sum(salary) from rollup_test group by deptno;
结果如下
然后我们对deptno进行rollup分组统计
select deptno,sum(salary) from rollup_test group by rollup(deptno);
可以看到,rollup的效果就是在按照正常的group by分组统计之后,它会根据某个列名再进行汇总统计。
效果相当于
select deptno,sum(salary) from rollup_test group by deptno
2 union all
3 select null, sum(salary) from rollup_test
4 order by 1;
然后我们再看对两个列进行rollup的情况
select deptno,name,sum(salary) from rollup_test group by rollup(deptno,name);
此时得到的查询结果如下
可以看到,此时的分组情况是先按照deptno和name分组,然后rollup会对相同deptno里的name汇总统计,相当于group by(deptno),然后再对deptno汇总统计,也就是所有行数据的统计。
效果相当于
select deptno,name,sum(salary) from rollup_test group by deptno, name
2 union all
3 select group_id,null,sum(salary) from rollup_test group by deptno
4 union all
5 select null,null,sum(salary) from rollup_test
6 order by 1,2;
总结:Rollup函数给数据统计和报表生成带来了极大的便利,学会这个函数对我们日常的工作有很大的帮助。
Best wishes,
DedZec
04.22.17
-------The End-------