oracle中的ROLLUP函数
本文通过演示给出Oracle ROLLUP分组函数的用法,体验一下Oracle在统计查询领域中的函数魅力。ROLLUP分组函数可以理解为Group By分组函数封装后的精简用法,这里同时给出ROLLUP的Group By的改写思路。
1.初始化实验坏境
1)创建测试表group_test
SECOOLER@ora11g> create table group_test (group_id int, job varchar2(10), name varchar2(10), salary int);Table created.
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)初始化之后的数据情况如下:
SECOOLER@ora11g> set pages 100
SECOOLER@ora11g> select * from group_test;GROUP_ID JOB NAME SALARY
---------- ---------- ---------- ----------10 Coding Bruce 100010 Programmer Clair 100010 Architect Gideon 100010 Director Hill 100020 Coding Jason 200020 Programmer Joey 200020 Architect Martin 200020 Director Michael 200030 Coding Rebecca 300030 Programmer Rex 300030 Architect Richard 300030 Director Sabrina 300040 Coding Samuel 400040 Programmer Susy 400040 Architect Tina 400040 Director Wendy 400016 rows selected.
2.先看一下普通分组的效果:对group_id进行普通的group by操作---按照小组进行分组
SECOOLER@ora11g> select group_id,sum(salary) from group_test group by group_id;GROUP_ID SUM(SALARY)
---------- -----------30 1200020 800040 1600010 4000
3.对group_id进行普通的roolup操作---按照小组进行分组,同时求总计
SECOOLER@ora11g> select group_id,sum(salary) from group_test group by rollup(group_id);GROUP_ID SUM(SALARY)
---------- -----------10 400020 800030 1200040 1600040000
使用Group By语句翻译一下上面的SQL语句如下(union all一个统计所有数据的行):
SECOOLER@ora11g> select group_id,sum(salary) from group_test group by group_id2 union all3 select null, sum(salary) from group_test4 order by 1;GROUP_ID SUM(SALARY)
---------- -----------10 400020 800030 1200040 1600040000
4.再看一个rollup两列的情况
SECOOLER@ora11g> select group_id,job,sum(salary) from group_test group by rollup(group_id, job);GROUP_ID JOB SUM(SALARY)
---------- ---------- -----------10 Coding 100010 Director 100010 Architect 100010 Programmer 100010 400020 Coding 200020 Director 200020 Architect 200020 Programmer 200020 800030 Coding 300030 Director 300030 Architect 300030 Programmer 300030 1200040 Coding 400040 Director 400040 Architect 400040 Programmer 400040 160004000021 rows selected.
上面的SQL语句该如何使用Group By进行翻译呢?
答案如下:
SECOOLER@ora11g> select group_id,job,sum(salary) from group_test group by group_id, job2 union all3 select group_id,null,sum(salary) from group_test group by group_id4 union all5 select null,null,sum(salary) from group_test6 order by 1,2;GROUP_ID JOB SUM(SALARY)
---------- ---------- -----------10 Architect 100010 Coding 100010 Director 100010 Programmer 100010 400020 Architect 200020 Coding 200020 Director 200020 Programmer 200020 800030 Architect 300030 Coding 300030 Director 300030 Programmer 300030 1200040 Architect 400040 Coding 400040 Director 400040 Programmer 400040 160004000021 rows selected.
5.补充一步,体验一下GROUPING函数的效果
直接看效果就OK啦:
SECOOLER@ora11g> select group_id,job,grouping(GROUP_ID),grouping(JOB),sum(salary) from group_test group by rollup(group_id, job);GROUP_ID JOB GROUPING(GROUP_ID) GROUPING(JOB) SUM(SALARY)
---------- ---------- ------------------ ------------- -----------10 Coding 0 0 100010 Director 0 0 100010 Architect 0 0 100010 Programmer 0 0 100010 0 1 400020 Coding 0 0 200020 Director 0 0 200020 Architect 0 0 200020 Programmer 0 0 200020 0 1 800030 Coding 0 0 300030 Director 0 0 300030 Architect 0 0 300030 Programmer 0 0 300030 0 1 1200040 Coding 0 0 400040 Director 0 0 400040 Architect 0 0 400040 Programmer 0 0 400040 0 1 160001 1 4000021 rows selected.
看出来什么效果了么?
有的同学还是没有看出来,小小的解释一下:
如果显示“1”表示GROUPING函数对应的列(例如JOB字段)是由于ROLLUP函数所产生的空值对应的信息,即对此列进行汇总计算后的结果。
如果显示“0”表示此行对应的这列参未与ROLLUP函数分组汇总活动。
如果还是没有理解清楚,请参见Oracle官方文档中的描述内容:“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.”
6.小结
ROLLUP在数据统计和报表生成过程中带来极大的便利,而且效率比起来Group By + Union组合方法效率高得多。这也体现了Oracle在SQL统计分析上人性化、自动化、高效率的特点。
ROLLUP与GROUP BY的关系可以参考Oracle官方文档中的例子,链接如下:《ROLLUP Extension to GROUP BY》http://docs.oracle.com/cd/E11882_01/server.112/e25554/aggreg.htm#DWHSG8608
转自:http://blog.itpub.net/519536/viewspace-610995
oracle中的ROLLUP函数相关推荐
- oracle中存储过程和函数有什么区别,Oracle中存储过程和函数的区别
Oracle中存储过程和函数的区别 存储过程和函数: www.2cto.com 例子: [sql] //创建过程 create or replace procedure add_emailinfo( ...
- oracle substr(table),oracle中的substr()函数
SUBSTR(cExpression,nStartPosition [,nCharactersReturned]) 其中,cExpression指定要从其中返回字符串的字符表达式或备注字段: nSta ...
- Oracle中的单行函数
字符串函数: 注意SUBSTR 如果向要从后向前截取,可以使用负数来表示 例如:SUBSTR('helloword',-3),表示截取最后三个字符,不写长度.默认从开始截取到字符串的末尾. 以上函数除 ...
- oracle取第一位,Oracle中的substr()函数和INSTR()函数
1)substr函数格式 (俗称:字符截取函数) 格式1: substr(string string,int a,int b); 格式2:substr(string string,int a) ; ...
- oracle中转换函数,Oracle中的转换函数
Oracle中的转换函数有三个,分别为to_char(),to_date(),to_number() 1.to_char()的用法 格式化当前的日期时间 select sysdate,to_char( ...
- oracle中的trim函数使用介绍
Oracle TRIM函数是很常见的函数,下面对Oracle TRIM函数的语法作了详尽的阐述说明,希望可以让您对Oracle TRIM函数有更深的认识. 如果提到Oracle TRIM函数,最简单的 ...
- oracle中如何写函数【oracle技术】
oracle中如何写函数[oracle技术] | 浏览:1377 | 更新:2014-04-29 23:14 | 标签:oracle 在oracle数据开发中函数是必不可少的.函数可以一般是可以完成某 ...
- oracle 字符转整数,Oracle中字符串转换函数小数转法
Oracle中字符串转换函数小数转法 类别:Oracle数据库 作者:码皇 来源:薛凯博客 点击: Oracle中字符串转换函数小数转法 to_char()函数的字符串转换格式归纳如下 ...
- Oracle中的instr()函数 详解及应用
1)instr()函数的格式 (俗称:字符查找函数) 格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串) 格式二:instr( strin ...
- oracle分类函数总结,oracle中分组排序函数用法
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
最新文章
- 5天玩转PyTorch深度学习,从GAN到词嵌入都有实例丨教程资源
- redis的flushall命令
- 一目了然“之IT运维可视化,让运维不再说难!
- SpringBoot高级-任务-定时任务
- MySQL性能优化之必备技能【推荐】
- 第五模块·WEB开发基础-第2章JavaScript基础
- Visual Studio 2010 sp1
- leetcode —— 38. 外观数列
- mysql左连接_面试考MySQL性能优化,一个问题就干趴下了!
- java并发2--进阶
- java switch case怎么判断范围_java小白从入门到精通(基础二)
- `ll/sc` 指令在`linux`中的软件实现
- python写一个ssh工具_用Python和JS实现的Web SSH工具,真香!
- JavaWeb 登陆界面
- jQuery EasyUI教程
- [转] 两种老公,两种人生。。(女人该看,男生更该看)
- 用PHP实现虎牙压豆稳赚不赔的方法,RNG和LGD比赛竞猜结算出错被骂骗豆平台,虎牙道歉又送5000Q币...
- SYSTRAN翻译系统的工作原理
- NVIDIA TX2 Ubuntu 18.04 无法打开SD卡/U盘的解决方法
- 【C、C++系列-10】C语言实现:百钱买百鸡问题