问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

谁能告诉我在oracle中的分析函数over,rollup,lag,rank函数的语法和如何使用的?谢谢啦!

发布网友 发布时间:2022-04-08 17:52

我来回答

3个回答

懂视网 时间:2022-04-08 22:14

 

  本文通过演示给出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            1000
        10 Programmer Clair            1000
        10 Architect  Gideon           1000
        10 Director   Hill             1000
        20 Coding     Jason            2000
        20 Programmer Joey             2000
        20 Architect  Martin           2000
        20 Director   Michael          2000
        30 Coding     Rebecca          3000
        30 Programmer Rex              3000
        30 Architect  Richard          3000
        30 Director   Sabrina          3000
        40 Coding     Samuel           4000
        40 Programmer Susy             4000
        40 Architect  Tina             4000
        40 Director   Wendy            4000

16 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       12000
        20        8000
        40       16000
        10        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        4000
        20        8000
        30       12000
        40       16000
                 40000

  使用Group By语句翻译一下上面的SQL语句如下(union all一个统计所有数据的行):
SECOOLER@ora11g> select group_id,sum(salary) from group_test group by group_id
  2  union all
  3  select null, sum(salary) from group_test
  4  order by 1;

  GROUP_ID SUM(SALARY)
---------- -----------
        10        4000
        20        8000
        30       12000
        40       16000
                 40000

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            1000
        10 Director          1000
        10 Architect         1000
        10 Programmer        1000
        10                   4000
        20 Coding            2000
        20 Director          2000
        20 Architect         2000
        20 Programmer        2000
        20                   8000
        30 Coding            3000
        30 Director          3000
        30 Architect         3000
        30 Programmer        3000
        30                  12000
        40 Coding            4000
        40 Director          4000
        40 Architect         4000
        40 Programmer        4000
        40                  16000
                            40000

21 rows selected.

上面的SQL语句该如何使用Group By进行翻译呢?
答案如下:
SECOOLER@ora11g> select group_id,job,sum(salary) from group_test group by group_id, job
  2  union all
  3  select group_id,null,sum(salary) from group_test group by group_id
  4  union all
  5  select null,null,sum(salary) from group_test
  6  order by 1,2;

  GROUP_ID JOB        SUM(SALARY)
---------- ---------- -----------
        10 Architect         1000
        10 Coding            1000
        10 Director          1000
        10 Programmer        1000
        10                   4000
        20 Architect         2000
        20 Coding            2000
        20 Director          2000
        20 Programmer        2000
        20                   8000
        30 Architect         3000
        30 Coding            3000
        30 Director          3000
        30 Programmer        3000
        30                  12000
        40 Architect         4000
        40 Coding            4000
        40 Director          4000
        40 Programmer        4000
        40                  16000
                            40000

21 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        1000
        10 Director                    0             0        1000
        10 Architect                   0             0        1000
        10 Programmer                  0             0        1000
        10                             0             1        4000
        20 Coding                      0             0        2000
        20 Director                    0             0        2000
        20 Architect                   0             0        2000
        20 Programmer                  0             0        2000
        20                             0             1        8000
        30 Coding                      0             0        3000
        30 Director                    0             0        3000
        30 Architect                   0             0        3000
        30 Programmer                  0             0        3000
        30                             0             1       12000
        40 Coding                      0             0        4000
        40 Director                    0             0        4000
        40 Architect                   0             0        4000
        40 Programmer                  0             0        4000
        40                             0             1       16000
                                       1             1       40000

21 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 CUBE operation. 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

Good luck.

secooler
12.04.21

-- The End --

[转]【ROLLUP】Oracle分组函数之ROLLUP魅力

标签:

热心网友 时间:2022-04-08 19:22

lag -- 与over联合使用 ,读取一个字段上第N个值
rank -- 与over联合使用 ,增加一个数值序号伪列
rollup -- 与group by 联合使用函数,屏蔽字段的重复值
例:
select ename,Lag(ename,1,null)over(order by ename) from emp;
select Rank()Over(order by sal),ename,sal from emp;
select deptno,sum(sal) from emp group by rollup(deptno);
更详细内容参看百度文库:http://wenku.baidu.com/view/9100bfded15abe23482f4d83.html

热心网友 时间:2022-04-08 20:40

1 楼对的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
tplink无线扩展器怎样重置密码 扩展器原始的密码是什么 如何重新设置TPLink扩展器的密码简单步骤教你修改TPLink扩展器的... 为什么要加入tcpip协议 父母如何给孩子做一个好榜样 父母应该如何做孩子的榜样? 冬季草原防火安全知识 冬季景区该如何预防火灾 厨房暗管漏水 多少钱 手脚出汗,睡眠不好,早泄是阳虚还是阴虚 中植创投APP靠谱么? 万喜国际创投安全吗? 北京金科创投国际贸易有限公司怎么样? 中城创投国际融资租赁有限公司怎么样? 可以用天际电器电饭煲提早煲粥吗?煲出来好吃吗 我用天际电炖锅做早餐,请问预约6小时是6小时开始做还是做好了的_百度... 苹果6无缘无故卡住,设置打不开怎么回事? 天际电器电饭煲有可以预约一整天的功能吗?推荐说说看 天际fd30xe-w电饭锅怎么预约 神舟战神61od_i5 d3笔记本电脑键盘怎么拆 神舟战神g7怎么拆卸键盘 神舟战神k660e i5d1 模具的键盘能更换成背光键盘吗 老虎狮子豹子谁厉害求大神帮助 豹子和老虎打架谁厉害? 神舟战神笔记本更换键盘维修分享 老虎狮子豹子它们谁最厉害啊? 狼、豹、虎、哪个比较厉害 为什么在QQ里设置背景的时候,里面没有那个小人标志? 虎厉害还是豹厉害 你作为一个男人喜欢看美女吗? 乐顿创投是合法的吗? 《夺子战争1997》原型是什么? 《夺子战争》演员有哪些? 夺子战争1997的内容 LGTC公益创投到底怎么样,是真的假的? 夺子战争1997的介绍 《夺子战争》怎么样 万喜国际创投安全吗 电视剧《夺子战争》演员表中都有哪些演员? 新婚之夜新郎新娘走错房间的电视剧有哪些 杨童舒出演过电视连续剧夺子战争吗? 赵学鹏和秀是什么电视剧? 前几年看的一部讲上海方言的电视连续剧,主要内容是夺子之战。请问电视剧名称。 名称有哪些? 榻榻米和普通的床有哪些区别?你知道吗? 榻榻米好,还是买床好。都有什么优缺点呢 水果电池有没有足够的功率给手机充电,如果有,应该怎么做 为什么西瓜可以让手机充电? 竟然可以给手机充电,到底是什么样的水果可以充电 榻榻米 隐形床 哪个好