今天是网上一哥儿们有个需求,然后问我的,之前是有看到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;
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;