本文通过演示给出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函数相关推荐

  1. oracle中存储过程和函数有什么区别,Oracle中存储过程和函数的区别

    Oracle中存储过程和函数的区别 存储过程和函数:  www.2cto.com 例子: [sql] //创建过程 create or replace procedure add_emailinfo( ...

  2. oracle substr(table),oracle中的substr()函数

    SUBSTR(cExpression,nStartPosition [,nCharactersReturned]) 其中,cExpression指定要从其中返回字符串的字符表达式或备注字段: nSta ...

  3. Oracle中的单行函数

    字符串函数: 注意SUBSTR 如果向要从后向前截取,可以使用负数来表示 例如:SUBSTR('helloword',-3),表示截取最后三个字符,不写长度.默认从开始截取到字符串的末尾. 以上函数除 ...

  4. oracle取第一位,Oracle中的substr()函数和INSTR()函数

    1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string,int a,int b); 格式2:substr(string string,int a) ; ...

  5. oracle中转换函数,Oracle中的转换函数

    Oracle中的转换函数有三个,分别为to_char(),to_date(),to_number() 1.to_char()的用法 格式化当前的日期时间 select sysdate,to_char( ...

  6. oracle中的trim函数使用介绍

    Oracle TRIM函数是很常见的函数,下面对Oracle TRIM函数的语法作了详尽的阐述说明,希望可以让您对Oracle TRIM函数有更深的认识. 如果提到Oracle TRIM函数,最简单的 ...

  7. oracle中如何写函数【oracle技术】

    oracle中如何写函数[oracle技术] | 浏览:1377 | 更新:2014-04-29 23:14 | 标签:oracle 在oracle数据开发中函数是必不可少的.函数可以一般是可以完成某 ...

  8. oracle 字符转整数,Oracle中字符串转换函数小数转法

    Oracle中字符串转换函数小数转法 类别:Oracle数据库   作者:码皇   来源:薛凯博客     点击: Oracle中字符串转换函数小数转法 to_char()函数的字符串转换格式归纳如下 ...

  9. Oracle中的instr()函数 详解及应用

    1)instr()函数的格式  (俗称:字符查找函数) 格式一:instr( string1, string2 )    /   instr(源字符串, 目标字符串) 格式二:instr( strin ...

  10. oracle分类函数总结,oracle中分组排序函数用法

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

最新文章

  1. 5天玩转PyTorch深度学习,从GAN到词嵌入都有实例丨教程资源
  2. redis的flushall命令
  3. 一目了然“之IT运维可视化,让运维不再说难!
  4. SpringBoot高级-任务-定时任务
  5. MySQL性能优化之必备技能【推荐】
  6. 第五模块·WEB开发基础-第2章JavaScript基础
  7. Visual Studio 2010 sp1
  8. leetcode —— 38. 外观数列
  9. mysql左连接_面试考MySQL性能优化,一个问题就干趴下了!
  10. java并发2--进阶
  11. java switch case怎么判断范围_java小白从入门到精通(基础二)
  12. `ll/sc` 指令在`linux`中的软件实现
  13. python写一个ssh工具_用Python和JS实现的Web SSH工具,真香!
  14. JavaWeb 登陆界面
  15. jQuery EasyUI教程
  16. [转] 两种老公,两种人生。。(女人该看,男生更该看)
  17. 用PHP实现虎牙压豆稳赚不赔的方法,RNG和LGD比赛竞猜结算出错被骂骗豆平台,虎牙道歉又送5000Q币...
  18. SYSTRAN翻译系统的工作原理
  19. NVIDIA TX2 Ubuntu 18.04 无法打开SD卡/U盘的解决方法
  20. 【C、C++系列-10】C语言实现:百钱买百鸡问题

热门文章

  1. matlab实验求不定积分函数,如何用matlab求取函数的不定积分与定积分 涨知识了...
  2. 三级等级保护之安全管理中心
  3. 学习数据库(1)——初始数据库
  4. 8uftp无法取得目录列表,解决8uftp无法取得目录列表的问题只需4步
  5. 完美数的算法设计(C语言)
  6. 学习plc编程需要掌握的知识点
  7. 马哥Python培训怎么样——再次革命性升级
  8. android抓取微信朋友圈,一种快速提取Android微信朋友圈数据的方法
  9. 多路复用之epoll模型
  10. 《css世界》中深藏不露的width:auto;总结