概述
今天主要分享Oracle ROLLUP分组函数的用法,体验一下Oracle在统计查询领域中的函数魅力。ROLLUP分组函数可以理解为Group By分组函数封装后的精简用法。
01
初始化实验坏境
1)创建测试表group_test
create table group_test (group_id int, job varchar2(10), name varchar2(10), salary int);
2)初始化数据
insert into group_test values (10,'Coding', 'Bruce',1000); insert into group_test values (10,'Programmer','Clair',1000); insert into group_test values (10,'Architect', 'Gideon',1000); insert into group_test values (10,'Director', 'Hill',1000); insert into group_test values (20,'Coding', 'Jason',2000); insert into group_test values (20,'Programmer','Joey',2000); insert into group_test values (20,'Architect', 'Martin',2000); insert into group_test values (20,'Director', 'Michael',2000); insert into group_test values (30,'Coding', 'Rebecca',3000); insert into group_test values (30,'Programmer','Rex',3000); insert into group_test values (30,'Architect', 'Richard',3000); insert into group_test values (30,'Director', 'Sabrina',3000); insert into group_test values (40,'Coding', 'Samuel',4000); insert into group_test values (40,'Programmer','Susy',4000); insert into group_test values (40,'Architect', 'Tina',4000); insert into group_test values (40,'Director', 'Wendy',4000); commit;
3)初始化之后的数据:
set pages 100 select * from group_test;
02
group by
先看一下普通分组的效果:对group_id进行普通的group by操作---按照小组进行分组
select group_id,sum(salary) from group_test group by group_id;
03
ROOLUP
对group_id进行普通的roolup操作---按照小组进行分组,同时求总计
select group_id,sum(salary) from group_test group by rollup(group_id);
使用Group By语句翻译一下上面的SQL语句如下(union all一个统计所有数据的行):
select group_id,sum(salary) from group_test group by group_id union all select null, sum(salary) from group_test order by 1;
04
rollup两列
select group_id,job,sum(salary) from group_test group by rollup(group_id, job);
上面的SQL语句该如何使用Group By进行翻译呢?
答案如下:
select group_id,job,sum(salary) from group_test group by group_id, job union all select group_id,null,sum(salary) from group_test group by group_id union all select null,null,sum(salary) from group_test order by 1,2;
05
GROUPING函数
select group_id,job,grouping(GROUP_ID),grouping(JOB),sum(salary) from group_test group by rollup(group_id, job);
说明:
如果显示“1”表示GROUPING函数对应的列(例如JOB字段)是由于ROLLUP函数所产生的空值对应的信息,即对此列进行汇总计算后的结果。
如果显示“0”表示此行对应的这列参未与ROLLUP函数分组汇总活动。
“Using a single column as its argument,GROUPING returns 1 when it encounters a NULL value created by a ROLLUP or CUBEoperation. That is, if the NULL indicates the row is a subtotal, GROUPING returns a 1. Any other type of value, including a stored NULL, returns a 0.”
06
总结
ROLLUP在数据统计和报表生成过程中带来极大的便利,而且效率比起来Group By + Union组合方法效率高得多。这也体现了Oracle在SQL统计分析上人性化、自动化、高效率的特点。
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~