小遇rollup和cube

   今天是网上一哥儿们有个需求,然后问我的,之前是有看到rollup和cube的用法,但是工作中一直没遇到过,今天闲,就稍微做了点测试,现在大致可以明白是个什么功能了

   需求是,做过分组行列转换之后,还需要有合计的一列。


   

create table score(
    name varchar2(10),
    subject varchar2(10),
    grade number(3)
) ;
insert into score values('Zhang','Language',80);
insert into score values('Zhang','Math',92);
insert into score values('Zhang','English',76);
insert into score values('Li','English',50);
insert into score values('Li','Math',95);
insert into score values('Li','Language',81);
insert into score values('Wang','Language',73);
commit;


一开始我是想着rollup和cube可以组合起来用,达到他的需求,但是一直不是很能弄出来,然后就尝试了两个办法,在百度上搜了一下两个的用法

http://blog.csdn.net/dyufei/article/details/4801283这个帖子是看了下,大概知道是个什么原理了

然后自己动手做

select name, subject, sum(grade) cd
          from score
         group by rollup(name, subject);



这个执行出来的结果,可以看到是,根据name合计出了总的分数

然后我想到,那个需求就是横向统计结果,所以就用行转列的方法

select a.name,
       sum(decode(a.subject, 'Language', a.cd, null)) "Language",
       sum(decode(a.subject, 'Math', a.cd, null)) "Math",
       sum(decode(a.subject, 'English', a.cd, null)) "English",
       sum(decode(a.subject,'',a.cd,null)) huizong
  from (select name, subject, sum(grade) cd
          from score
         group by rollup(name, subject)) a
         group by a.name;

这是我哥儿们要的需求。

然后又做了个竖向求和的

select name, subject, sum(grade) cd
          from score
         group by cube(name, subject);

这个结果就是在最后的时候会根据三个人的每门课程都汇总一下结果

然后同样行转列

select a.name,
       sum(decode(a.subject, 'Language', a.cd, null)) "Language",
       sum(decode(a.subject, 'Math', a.cd, null)) "Math",
       sum(decode(a.subject, 'English', a.cd, null)) "English",
       sum(decode(a.subject,'',a.cd,null)) huizong
  from (select name, subject, sum(grade) cd
          from score
         group by cube(name, subject)) a
         group by a.name;


这样,基本上下次遇到类似需求的话,就可以应付了。


20140401

无聊,突然想起前几天一个人,他需要能在上面结果的第四行的name那个空着的地方写上总分,于是,有grouping函数

grouping函数用法,带一个参数,参数为字段名,结果是根据该字段得出来的就返回1,反之返回0

当字段有值的时候,grouping(字段)结果就会是0,如果这个字段没有值,grouping(字段)结果就是1


select a.name,  
       sum(decode(a.subject, 'Language', a.cd, null)) "Language",  
       sum(decode(a.subject, 'Math', a.cd, null)) "Math",  
       sum(decode(a.subject, 'English', a.cd, null)) "English",  
       sum(decode(a.subject,'subject',a.cd,null)) huizong  
  from (select decode(grouping(name),1,'总分',name) name,
       decode(grouping(subject),1,'subject',subject) subject,
        sum(grade) cd  
          from score  
         group by cube(name, subject)) a  
         group by a.name; 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值