分析函数——rollup,cube,rank,partition by
2012-04-18 15:41
274 查看
记录开始前,先看看测试表的表结构吧
![](http://pic002.cnblogs.com/images/2012/175644/2012041814445416.png)
该表字段由上而下分别代表月份,行区,区县,套餐和收入。
根据该表完成以下练习:
1.汇总出一个各行区和全市的收入报表:
a).仅按行区分组:
![](http://pic002.cnblogs.com/images/2012/175644/2012041814502690.jpg)
查询结果显示各个行区的收入以及全市的总收入。
b).按照月份和行区分别分组:
![](http://pic002.cnblogs.com/images/2012/175644/2012041815001434.jpg)
结果显示月份和行区的组合分组以及全市的总收入。
2.按月份和行区汇总一个各行区和全市以及各月和全年的收入报表:
![](http://pic002.cnblogs.com/images/2012/175644/2012041815061983.jpg)
3.取得各月收入排名前十的套餐的收入,并给出名次:
![](http://pic002.cnblogs.com/images/2012/175644/2012041815091991.jpg)
注:这里应该注意的是rank、dense_rank、row_number的区别:
如,在排名字段中存在相同的值,即存在并列排名是时,执行下面查询语句,列出排名情况:
![](http://pic002.cnblogs.com/images/2012/175644/2012041815294291.png)
注意对比查询结果中存在并列排名的列,rank在并列排名后,保留5、6直接到达第七名,dense_rank则在第4名之后顺序排第5名,而row_number则忽略掉并列情况,只根据查询顺序流出4、5、6、7...
所以,在实际应用中,应当注意三种排名的区别,尤其存在并列排名时,row_number易丢掉数据,而rank和dense_rank则各有特点。
5.取出各月收入最多的行区的收入:
![](http://pic002.cnblogs.com/images/2012/175644/2012041814445416.png)
该表字段由上而下分别代表月份,行区,区县,套餐和收入。
根据该表完成以下练习:
1.汇总出一个各行区和全市的收入报表:
a).仅按行区分组:
select decode(grouping(xingqu),1,'合计',xingqu) xingqu,sum(income) 总收入 from trainquestion_5_1 group by rollup(xingqu);
![](http://pic002.cnblogs.com/images/2012/175644/2012041814502690.jpg)
查询结果显示各个行区的收入以及全市的总收入。
b).按照月份和行区分别分组:
select decode(grouping_id(xingqu,monthtime),2,'小计',3,'合计',xingqu) xingqu, decode(grouping_id(xingqu,monthtime),1,'小计',3,'合计',monthtime) monthtime, sum(income) 总收入 from trainquestion_5_1 group by rollup(xingqu,monthtime);
![](http://pic002.cnblogs.com/images/2012/175644/2012041815001434.jpg)
结果显示月份和行区的组合分组以及全市的总收入。
2.按月份和行区汇总一个各行区和全市以及各月和全年的收入报表:
select decode(grouping_id(xingqu,monthtime),2,'小计',3,'合计',xingqu) xingqu, decode(grouping_id(xingqu,monthtime),1,'小计',3,'合计',monthtime) monthtime, sum(income) 总收入 from trainquestion_5_1 group by cube(xingqu,monthtime);
![](http://pic002.cnblogs.com/images/2012/175644/2012041815061983.jpg)
3.取得各月收入排名前十的套餐的收入,并给出名次:
select monthtime,taocan,总收入,排名 from ( select monthtime,taocan,sum(income) 总收入, Rank() over(order by sum(income) desc) 排名 from trainquestion_5_1 group by monthtime,taocan ) where 排名<11;
![](http://pic002.cnblogs.com/images/2012/175644/2012041815091991.jpg)
注:这里应该注意的是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;
![](http://pic002.cnblogs.com/images/2012/175644/2012041815294291.png)
注意对比查询结果中存在并列排名的列,rank在并列排名后,保留5、6直接到达第七名,dense_rank则在第4名之后顺序排第5名,而row_number则忽略掉并列情况,只根据查询顺序流出4、5、6、7...
所以,在实际应用中,应当注意三种排名的区别,尤其存在并列排名时,row_number易丢掉数据,而rank和dense_rank则各有特点。
5.取出各月收入最多的行区的收入:
select * from ( select monthtime,xingqu,sum(income) 总收入, Rank() over(partition by monthtime order by sum(income) desc) from trainquestion_5_1 group by monthtime,xingqu ) where t='1';
![](http://pic002.cnblogs.com/images/2012/175644/2012041815112572.jpg)
相关文章推荐
- oracle提供的分析函数 cube(),rollup(),grouping sets()-----关注grouping sets用法及原理
- Oracle select --分析函数cube(),rollup()
- rollup、cube、grouping、rank、dense_rank、row_number函数简介
- oracle分析函数——rollup和cube
- oracle 分析函数 之 rollup,cube
- Oracle分析函数八——CUBE,ROLLUP
- ORACLE 分析函数详解: RollUP,Cube
- Hive分析函数之grouping sets、cube、rollup学习
- rollup与cube分析函数学习总结
- Oracle分析函数八——CUBE,ROLLUP
- Oracle分析函数八——CUBE,ROLLUP
- Oracle分析函数八——CUBE,ROLLUP
- oracle分析函数系列之ROLLUP和CUBE
- Oracle分析函数八——CUBE,ROLLUP
- Oracle分析函数八——CUBE,ROLLUP
- Oracle分析函数 — sum, rollup, cube, grouping用法
- oracle的分析函数over(Partition by...)
- Oracle 分析函数rank(),dense_rank(),row_number()
- oracle 分析函数 RANK、DENSE_RANK、ROW_NUMBER
- group by 子句中用 rollup 、cube以及用grouping()函数