oracle的rollup操作---按照小组进行分组,同时求总计

转载 2016年08月28日 15:58:50

rollup配合goup by使用,照小组进行分组,同时求总计。可以提供信息汇总功能(类似于"小计")
ROLLUP在数据统计和报表生成过程中带来极大的便利

 

rollup操作---按GROUP BY ROLLUP()本身是分组统计求和的意思

 

如果是ROLLUP(A, B, C)的话,
首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。

 

 


下面是一个简单例子:
1、不使用group by 分组

 查询各部门各职位的工资情况
select   job,deptno,sal  

from   emp

order by job, deptno

 

JOB           DEPTNO            SAL
ANALYST      20              3000.00
ANALYST      20              3000.00    --->group by 之后 ANALYST    20      6000.00

CLERK         10               1300.00
CLERK         20                800.00
CLERK         20               1100.00
CLERK         30               950.00

MANAGER    10               2450.00
MANAGER    20               2975.00
MANAGER    30               2850.00

PRESIDENT 10               5000.00

SALESMAN  30               1250.00
SALESMAN  30               1500.00
SALESMAN  30               1250.00
SALESMAN  30               1600.00

 

2、使用group by 分组
select job,deptno,sum(sal) total_sal   
from emp   
group by rollup(job,deptno); 
查询员工表,对各个部门的各个职位进行分组,对工资进行小计和总计

JOB         DEPTNO      TOTAL_SAL
CLERK         10               1300
CLERK         20               1900
CLERK         30                 950
CLERK                             4150

ANALYST      20               6000
ANALYST                        6000

MANAGER     10              2450
MANAGER     20              2975
MANAGER     30              2850
MANAGER                       8275

SALESMAN    30             5600
SALESMAN                     5600 

PRESIDENT   10             5000 
PRESIDENT                    5000          -->PRESIDENT职位总计

                                    29025         --->总计

 

如果year不想累加,可以写成
Select year,month,area,sum(total_sale) from SaleOrder group by year, rollup(month,area)
        
Grouping用法

 

Grouping是用来判断当前Column是否是一个合计列,1为yes
Select Decode(Grouping(area),1,'所有地区',area) area, 
       Decode(Grouping(month),1,'所有月份',month), sum(money) 
From   SaleOrder 
Group by RollUp(area,month);

 

--如果是一个合计列,则用Decode把它转为"所有月份" 、'所有地区'

 

 

rollup 如何去掉最后一行的总统计

使用:grouping_id

select   job,deptno,sum(sal)   total_sal   from   emp   group   by   rollup(job,deptno) 
having grouping_id(job,deptno)<=1

 

查询的结果就会把最后一行的总计给去掉

 

grouping_id中括号里面的字段和rollup括号里面的字段一致就行
grouping_id是肿么来的?它是oracle的函数,针对rollup和cube的
grouping_id的数字是怎么确定的?
向量值,可以认为是二进值的数,例:grouping_id(a,b,c),如果列a为空就是0 非空为1,列b和列c也一样
结果会得到一个三位数,用二进制转换成十进制就是了,例:a,b,c全是非空,说明这行数据是一个总计,那么就是111
即7,三列就是7,如果是两列自然是11就是3了。
因为Grouping是用来判断当前Column是否是一个合计列,如果是一个合计列,则相应的列会是一个空值

 


转载地址:http://wjlvivid.iteye.com/blog/1696436

 

相关文章推荐

Oracle的rollup、cube、grouping sets函数

Oracle的rollup、cube、grouping sets函数
  • huang_xw
  • huang_xw
  • 2011年05月07日 20:54
  • 15331

Oracle-rollup()函数

参考学习了: http://blog.itpub.net/519536/viewspace-610995 http://blog.csdn.net/huang_xw/article/details...
  • mxmxz
  • mxmxz
  • 2016年06月24日 11:17
  • 1582

ORACLE rollup函数的使用(与group by一起使用)

ROLLUP:为每个分组返回小计记录。(首先按job_id进行分组合计,然后按division_id进行分组合计,最后整体合计(见表格最后一行)) 可以参考下面的例子。...

rollup分析函数

表的初始数据: 使用rollup进行汇总之后的数据: select t.first_name,sum(t.salary)  from t_test1 t group by rollup(t.fir...

oracle group by rollup实现小计、合计

oracle group by rollup实现小计、合计

Oracle group by高级用法对比效果(ROLLUP、GROUPING SETS、CUBE)

Oracle group by高级用法对比效果(ROLLUP、GROUPING SETS、CUBE),今天主要跟大家演示一下,在同一组数据的情况下,每个SQL的执行结果。      一:普通的grou...

Oracle group by 基本及的拓展 ROLLUP, CUBE, GROUPING 功能and GROUPING 集合

分类: Oracle 目录(?)[-]  声明本人不是专门学数据库的也不是专门的翻译只是因为碰到一个问题SQL CookBook中找了一下发现一个英文网站的解释很清晰...

ORACLE中每个分组后加个合计,最后总合计的GROUP BY rollup,和中文排序

参考代码如下 SELECT LOCAL_NAME , DEPT_DISTINGUISH_NAME , SUM(TOTAL_PAY_SUM_R_LDC) TOTAL_PAY_SUM_R...

Superset搭建

作者:秦路 链接:https://zhuanlan.zhihu.com/p/28485468 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Supe...

Oracle-rollup()函数

参考学习了: http://blog.itpub.net/519536/viewspace-610995 http://blog.csdn.net/huang_xw/article/details...
  • mxmxz
  • mxmxz
  • 2016年06月24日 11:17
  • 1582
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle的rollup操作---按照小组进行分组,同时求总计
举报原因:
原因补充:

(最多只允许输入30个字)