玖叶教程网

前端编程开发入门

详解Oracle分组函数之ROLLUP(oracle 分组语句)

概述

今天主要分享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方面的内容,感兴趣的朋友可以关注一下~

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言