oracle rollup和cube

oracle--rollup 和cube分组累计求和

  group by 语句支持基本的having条件,还支持rollup和cube提供信息汇总功能,类似小计。

  rollup:纵向小计,从右向左逐个对每一列进行小结并在结果中生成独立的一行。只返回第一个分组条件指定的列的统计行。

  cube:横行小计

  select d.deptno,t.job,sum(t.sal) from emp t,dept d where t.deptno=d.deptno group by rollup(d.deptno,t.job)

  执行结果:

 使用grouping_id显示指定的分组级别的记录。返回grouping()位向量的十进制值,GROUPING位向量的计算方法是将按照顺序对每一列调用GROUPING函数的结果组合起来。

  例:grouping_id(a,b,c),a为空就是0非空为1,b和c也一样,结果会得到一个三位数,用二进制转换成十进制就是了,a,b,c全是非空,即111就是7,三列就是7,如果是两列自然是11就是3

  select ... from 表 group by rollup(.....) having grouping_id(....)<=1

rollup(x,y)2列rollup(x,y,z)3列
总计是grouping_id=3总计是grouping_id=7
小计grouping_id=1小计grouping_id=3
记录是grouping_id=0记录是grouping_id=0

  此时要求不显示最后总计行:

  select d.deptno,t.job,sum(t.sal) from emp t,dept d where t.deptno=d.deptno group by rollup(d.deptno,t.job)having grouping_id(d.deptno,t.job)<=1

执行结果:

实际情况中要展示结果集中汇总列加上小计和合计,此时这样处理:

  select decode(grouping_id(deptno,job),1,'小计',3,'总计',job||deptno) as group_col,sum(sal) from emp group by rollup(deptno,job)

  执行结果:

------------------------------------------------------------------------------------------------------


/*
 group by 语句支持基本的having条件,还支持rollup和cube提供信息汇总功能,类似小计。
 rollup:纵向小计,从右向左逐个对每一列进行小结并在结果中生成独立的一行。只返回第一个分组条件指定的列的统计行。


1
   Grouping:
  就是用来判断当前列是否是一个合计列

它只能在rollup和或cube函数中使用
2
grouping_id也可以理解为统计结果的级别
这是计算分组级别的函数。仅当指定了 GROUP BY 时,GROUPING_ID 才能在 SELECT <select> 列表、HAVING 或 ORDER BY 子句中使用。

每个 GROUPING_ID 参数都必须是 GROUP BY 列表的一个元素。GROUPING_ID () 返回一个 integer 位图,
其最低 N 位可能为文字。文字 bit 表明对应参数不是给定输出行的分组列。
最低顺序 bit 对应于参数 N,第 N-1 个最低顺序 bit 对应于参数 1。

GROUPING_ID () 等效项
对于单个分组查询,GROUPING (<column_expression>) 与 GROUPING_ID (<column_expression>) 等价,两者均返回 0。

group_id()唯一标识重复
*/

SELECT CASE
         WHEN GROUPING_ID = 7 THEN
          YEARS
         WHEN GROUPING_ID = 3 THEN
          LPAD(' ',4) || MODEL
         WHEN GROUPING_ID = 1 THEN
          LPAD(' ',8) || STATUS
         ELSE
          LPAD(' ',12) || BATCH_NO
       END AS COLS,
      -- A.*,
       NUM
  FROM (SELECT TTS.YEARS,
               TTS.MODEL,
               TTS.STATUS,
               TTS.BATCH_NO,
               SUM(TTS.NUM) AS NUM,
               GROUPING_ID(TTS.YEARS, TTS.MODEL, TTS.STATUS, TTS.BATCH_NO) AS GROUPING_ID
          FROM (select t.years,t.model,t.status,s.batch_no ,t.num from ETS_NOTICEINFO_YMS_V t,web_aircraftinfo_sum s
where t.id=s.id) TTS
         GROUP BY ROLLUP(TTS.YEARS, TTS.MODEL, TTS.STATUS, TTS.BATCH_NO)
        HAVING GROUPING_ID(TTS.YEARS, TTS.MODEL, TTS.STATUS, TTS.BATCH_NO) <> 15
         ORDER BY YEARS desc,
                  MODEL NULLS FIRST,
                  STATUS NULLS FIRST, TTS.BATCH_NO NULLS FIRST) A;

--------------------------------------------------------------------------------

这个是数据源:而我想要的结果则在下面

----------

-------------------------------------------------------------------------------------------------------------------

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值