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
PRESIDENT10 5000.00
SALESMAN30 1250.00
SALESMAN 30 1500.00
SALESMAN 301250.00
SALESMAN 301600.00
2、使用group by 分组
select job,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
ANALYST6000
MANAGER 10 2450
MANAGER 20 2975
MANAGER 30 2850
MANAGER 8275
SALESMAN 30 5600
SALESMAN 5600
PRESIDENT 105000
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),'所有月份',month),sum(money)
From SaleOrder
Group by RollUp(area,month);
--如果是一个合计列,则用Decode把它转为"所有月份" 、'所有地区'
rollup 如何去掉最后一行的总统计
使用:grouping_id
select job,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
原文链接:https://www.f2er.com/oracle/212890.html