分析函数——rollup,cube,rank,partition by
记录开始前,先看看测试表的表结构吧
该表字段由上而下分别代表月份,行区,区县,套餐和收入。
根据该表完成以下练习:
1.汇总出一个各行区和全市的收入报表:
a).仅按行区分组:
1 select decode(grouping(xingqu),1,'合计',xingqu) xingqu,sum(income) 总收入 from trainquestion_5_1 group by rollup(xingqu);
查询结果显示各个行区的收入以及全市的总收入。
b).按照月份和行区分别分组:
1 select decode(grouping_id(xingqu,monthtime),2,'小计',3,'合计',xingqu) xingqu, 2 decode(grouping_id(xingqu,monthtime),1,'小计',3,'合计',monthtime) monthtime, 3 sum(income) 总收入 4 from trainquestion_5_1 5 group by rollup(xingqu,monthtime);
结果显示月份和行区的组合分组以及全市的总收入。
2.按月份和行区汇总一个各行区和全市以及各月和全年的收入报表:
1 select decode(grouping_id(xingqu,monthtime),2,'小计',3,'合计',xingqu) xingqu, 2 decode(grouping_id(xingqu,monthtime),1,'小计',3,'合计',monthtime) monthtime, 3 sum(income) 总收入 4 from trainquestion_5_1 5 group by cube(xingqu,monthtime);
3.取得各月收入排名前十的套餐的收入,并给出名次:
1 select monthtime,taocan,总收入,排名 2 from 3 ( 4 select monthtime,taocan,sum(income) 总收入, 5 Rank() over(order by sum(income) desc) 排名 6 from trainquestion_5_1 7 group by monthtime,taocan 8 ) 9 where 排名<11;
注:这里应该注意的是rank、dense_rank、row_number的区别:
如,在排名字段中存在相同的值,即存在并列排名是时,执行下面查询语句,列出排名情况:
select monthtime,taocan,sum(income) 总收入, Rank() over(order by sum(income) desc) rank, dense_rank() over(order by sum(income) desc) dense_rank, row_number() over(order by sum(income) desc) row_number from trainquestion_5_1 group by monthtime,taocan;
注意对比查询结果中存在并列排名的列,rank在并列排名后,保留5、6直接到达第七名,dense_rank则在第4名之后顺序排第5名,而row_number则忽略掉并列情况,只根据查询顺序流出4、5、6、7...
所以,在实际应用中,应当注意三种排名的区别,尤其存在并列排名时,row_number易丢掉数据,而rank和dense_rank则各有特点。
5.取出各月收入最多的行区的收入:
1 select * 2 from 3 ( 4 select monthtime,xingqu,sum(income) 总收入, 5 Rank() over(partition by monthtime order by sum(income) desc) from trainquestion_5_1 6 group by monthtime,xingqu 7 ) 8 where t='1';
posted on 2012-04-18 15:41 Rigwarl.Z 阅读(1630) 评论(0) 编辑 收藏 举报