oracle GROUP BY rollup
rollup:为每个分组返回一个小计,同时为所有分组返回总计;
SQL> select emp_id,month,prd_type_id,amount
2 from all_sales
3 where emp_id=21
4 order by emp_id,month ;
EMP_ID MONTH PRD_TYPE_ID AMOUNT
---------- ---------- ----------- ----------
21 1 4 3034.84
21 1 3 6034.84
21 1 2 1034.84
21 1 5
21 1 1 10034.84
21 2 3 1944.65
21 2 4 2944.65
21 2 1 15144.65
注:表中数据太多,只显示了一部分。
表all_sales存放2003年每个员工每个产品每个月的销量,
SQL> select emp_id,month,sum(amount)
2 from all_sales
3 where emp_id=21
4 group by emp_id,month
5 order by month ;
EMP_ID MONTH SUM(AMOUNT)
---------- ---------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 4 35729.8
21 5 25358.24
21 6 28258.56
21 7 36449.36
21 8 62639.28
21 9 49418.28
21 10 80016.76
21 11 41018.92
21 12 36139.36
用ROLLUP 进行分组
SQL> select emp_id,month,sum(amount)
2 from all_sales
3 where emp_id=21
4 group by rollup(emp_id,month) ;
EMP_ID MONTH SUM(AMOUNT)
---------- ---------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 4 35729.8
21 5 25358.24
21 6 28258.56
21 7 36449.36
21 8 62639.28
21 9 49418.28
21 10 80016.76
21 11 41018.92
21 12 36139.36
21 466997.84
466997.84
ROLLUP(emp_id,month):先对每个EMP_id的每个月的销量
进行分组求和,相当于GROUP BY EMP_ID,MONTH,得出这个员工,
每个月的销量总和,然后求这个员工一年所有的销量,相当于
GROUP BY EMP_ID,最后所求所有员工的销量总和,
因为查询限制只返回EMP_ID=21的数据,所以
最后两条记录的值相同。
group by rollup(emp_id,month) 与group by emp_id,month
不同之处在于是,group by rollup(emp_id,month) 求得每个员工的
月销量之后,又多做了两个工作,一是求得每个员一年所有的销量,
二是求所有员工的年总销量。
如果除去where emp_id=21,则最后一条记录返回所有员工的总销量,如:
SQL> select emp_id,month,sum(amount)
2 from all_sales
3 group by rollup(emp_id,month) ;
EMP_ID MONTH SUM(AMOUNT)
---------- ---------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 4 35729.8
21 5 25358.24
21 6 28258.56
21 7 36449.36
21 8 62639.28
21 9 49418.28
21 10 80016.76
21 11 41018.92
21 12 36139.36
21 466997.84
22 1 21939.36
22 2 21078.6
23 6 15658.56
23 7 33649.3
23 11 30518.92
23 12 24139.36
23 323077.84
24 1 14669.36
24 2 28878.6
24 3 35651.32
24 10 30116.76
24 11 22621.92
24 12 24139.36
24 333370.84
25 1 7269.36
25 2 13678.6
25 11 12821.92
25 12 12639.36
25 187970.84
26 1 16568.75
26 11 14821.38
26 12 15639.37
26 228769.93
1972485.13
数据太多,只显示一部分。
可以看出,group by rollup(emp_id,month) 为每个员工的销量进行了
汇总,得出了月销量和年销量(每个员工的最后一条),同时为所有员工进行了汇总,得出所有
员工的年总销量(最后一条记录)
函数:grouping
接收列作为参数,如果列为空,则grouping返回1,否则返回0,该函数与rollup搭配使用。
可以使用grouping函数对上述查询进行处理。
SQL> SELECT DECODE(GROUPING(EMP_ID), 1, '所有员工', EMP_ID) EMP_ID,
2 nvl2(emp_id,DECODE(GROUPING(MONTH), 1, '员工年度', MONTH),'所有员工年度') ND,
3 SUM(AMOUNT)
4 FROM ALL_SALES
5 GROUP BY ROLLUP(EMP_ID, MONTH)
6 ;
EMP_ID ND SUM(AMOUNT)
---------------------------------------- ---------------------------------------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 12 36139.36
21 员工年度 466997.84
26 7 12549.36
26 8 23139.28
26 9 19318.28
26 10 26116.99
26 11 14821.38
26 12 15639.37
26 员工年度 228769.93
所有员工 所有员工年度 1972485.13
oracle GROUP BY rollup的更多相关文章
- oracle group by rollup,decode,grouping,nvl,nvl2,nullif,grouping_id,group_id,grouping sets,RATIO_TO
干oracle 047文章12当问题,经验group by 声明.因此邂逅group by rollup,decode,grouping,nvl,nvl2,nullif,RATIO_TO_REPOR ...
- Oracle Group by+rollup+cube 的应用
首先我们创建一个示例表: Create table test_group (v_name varchar2(4) ,v_size varchar2(4) ,v_color varchar2(4) ,n ...
- oracle group by rollup实现小计、合计
SQL合计汇总实现数据N+1条显示: 注意group by rollup((ename, job, empno))!!! select decode(grouping(ename) + groupin ...
- oracle group by中cube和rollup字句的使用方法及区别
oracle group by中rollup和cube的区别: Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句. 如果是ROLLUP(A, B, C)的话,先 ...
- [Oracle] Group By 语句的扩展 - Rollup、Cube和Grouping Sets
常常写SQL语句的人应该知道Group by语句的主要使用方法是进行分类汇总,以下是一种它最常见的使用方法(依据部门.职位分别统计业绩): SELECT a.dname,b.job,SUM(b.sal ...
- oracle按照指定列分组合计group by rollup()
group by rollup() 按分组合计 select grouping(status),status,owner,object_type,count(*) from dba_objects w ...
- Oracle:grouping和rollup
Oracle grouping和rollup简单测试 SQL,,,) group by department_id order by department_id; DEPARTMENT_ID SUM( ...
- GROUP BY ROLLUP和CUBE 用法
ROLLUP和CUBE 用法 Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句. 如果是Group by ROLLUP(A, B, C)的话 ...
- Oracle分析函数 — sum, rollup, cube, grouping用法
本文通过例子展示sum, rollup, cube, grouping的用法. //首先建score表 create table score( class nvarchar2(20), course ...
随机推荐
- 用margin还是用padding?(3)—— 负margin实战
看过一篇文章是关于我知道你不知道的负Margin,里面对margin做了总结: 当margin四个值都为正数值的话,那么margin按照正常逻辑同周围元素产生边距.当元素margin的top和left ...
- boost replace_if replace_all_regex_copy用法
#include <boost/algorithm/string.hpp> // for is_any_of #include <boost/range/algorithm/repl ...
- 【linux】lsof命令和{Linux下文件删除、句柄与空间释放问题}
导读: 一.用事实说话 二.关于LSOF命令的其它用法: 三.参考文档: 正文: lsof:Finding open files with lsof 作用:查看文件被哪些进程打开 一.用事实说 ...
- 【CQ18高一暑假前挑战赛3.5】标程
[A:快速幂相关] #include<bits/stdc++.h> using namespace std; int qpow(int a,int x){ a%=;; while(x){ ...
- linux安装flume及问题
验证是否安装成功: [root@master conf]# /usr/local/src/apache-flume-1.6.0-bin/bin/flume-ng versionError: Could ...
- [LeetCode] Longest Valid Parentheses -- 挂动态规划羊头卖stack的狗肉
(Version 1.3) 这题在LeetCode上的标签比较有欺骗性,虽然标签写着有DP,但是实际上根本不需要使用动态规划,相反的,使用动态规划反而会在LeetCode OJ上面超时.这题正确的做法 ...
- Jmeter 在什么情况下定义多个thread group?
Jmeter里面有三种线程组:setUp thread group, TearDown thread group, thread group. 如果想定义100个用户登录系统,60个用户做A操作,40 ...
- Dubbo原理与框架设计
Dubbo是常用的开源服务治理型RPC框架,在之前osgi框架下不同bundle之间的方法调用时用到过.其工作原理和框架设计值得开源技术爱好者学习和研究. 一.Dubbo的工作原理 调用关系说明 服务 ...
- bzoj 1098 [POI2007]办公楼biu——链表
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098 求补图的连通块大小.与自己没有边的和自己在一个连通块里. 用链表把所有点串起来.先给自 ...
- hibernate学习四 hibernate关联关系映射
在Hibernate中对象之间的关联关系表现为数据库中表于表之间的关系(表之间通过外键关联). 1 单向的一对一 主键关联 外键关联 2 单向的一对多 3 单向的多对一 4 单向的多对多 5 双向的 ...