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

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是否是一个合计列,如果是一个合计列,则相应的列会是一个空值

select to_char(to_date(tt.inst_date, 'yyyy-mm-dd'), 'yyyy-mm-dd') as inst_date,
       nvl(c.username, tt.opr_id) as opr_id,
       nvl(l.name, d.card_type) as card_type,
       tt.bat_mchnt_id,
       to_char(sum(tt.txn_amt) / 100, 'fm9999999990.00') as txn_amt,
       count(*) as count
  from (select nvl(m.chnshort,'零星售卡') as bat_mchnt_id,
               t.inst_date,
               t.opr_id,
               t.card_deposit as txn_amt,
               t.card_no
          from t_dtl_author t
         left join t_inf_mchnt m on (t.bat_mchnt_id = m.mchnt_id)
         where ahth_txn_type = '1324'
          and t.mchnt_id <> '000000000000891' AND t.inst_date='20120917'
          ?:1) tt

  left join mnguserinfotb c on (c.operatorcardid = tt.opr_id)
  left join v_inf_card  d on (tt.card_no = d.card_no)
  left join (select distinct (card_type) as card_type, name, mediatype
               from t_cardkind_para) l on (d.card_type = l.card_type)
 group by rollup(tt.inst_date, nvl(c.username, tt.opr_id),
                 nvl(l.name, d.card_type),tt.bat_mchnt_id) 
                
                 
                 
                 
               

猜你喜欢

转载自wjlvivid.iteye.com/blog/1696436