oracle中rollup的使用(rollup和rank的结合使用)


声明:本文转载自https://my.oschina.net/u/4038621/blog/3044971,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

1.rollup的作用

用来对每个分组的数据进行小计或者合计。

2.求每个学生的所有课程成绩的平均分

1)使用pl/sql查询SC表,这个表是安装oracle时默认安装的scott用户下的表。

2)查询每个学生的平均成绩

3.统计所有学生的平均成绩

那我们如何将每个学生的平均成绩和所有学生的平均成绩放在一个查询结果里呢?这就需要使用到rollup函数。

4.rollup函数的使用

1)使用rollup

select t.sno, avg(t.score) from SC t group by rollup(t.sno);

2)改进rollup

上一个查询结果第5行的SNO字段是空的,需要我们填入默认值。这里可以使用nvl函数。

select nvl(t.sno,'所有学生'), avg(t.score) from SC t group by rollup(t.sno);

5.学生平均成绩排名,rank函数的使用

select t.sno, avg(t.score) "平均分", rank() over(order by avg(t.score) desc) "成绩排名" from SC t group by t.sno;

rank()是oracle排序函数,over(order by avg(t.score) desc)是开窗函数。表示按照avg(t.score)值倒序排列。
如果我想把所有学生的平均成绩放进这个查询结果里可以吗?我们试试。

6.查询每个学生的平均成绩和所有学生的平均成绩,并且按照成绩倒序排列

1)rollup和rank函数结合使用

select nvl(t.sno,'所有学生'), avg(t.score) "平均分", rank() over(order by avg(t.score) desc) "成绩排名" from SC t group by rollup(t.sno);


我想把统计结果排除在排序函数外怎么办?也就是我只想让每个学生按照平均成绩排序,所有学生的平均成绩不计入排序函数。

2)去掉统计结果行的排序

select nvl(t.sno, '所有学生'),
       avg(t.score) "平均分",
       rank() over(Partition by grouping(t.sno) order by avg(t.score) desc) "成绩排名"
  from SC t
 group by rollup(t.sno);

在over()开窗函数中加入Partition by grouping(t.sno),表示按照grouping(t.sno)进行分组。

grouping函数解释: 如果显示“1”表示GROUPING函数对应的列(例如sno字段)是由于ROLLUP函数所产生的空值对应的信息,即对此列进行汇总计算后的结果。
如果显示“0”表示此行对应的这列参未与ROLLUP函数分组汇总活动。
我们这样理解:使用rollup函数后,在统计列(如sno字段)上使用grouping函数后,合计行和非合计行的返回值不一样。我们就可以使用grouping(t.sno)进行分组。

3)再次改进,将‘所有学生’行的成绩排名字段置空

select nvl(t.sno, '所有学生'),
       avg(t.score) "平均分",
       case
         when grouping(t.sno) = 1 then
          null
         else
          rank()
          over(Partition by grouping(t.sno) order by avg(t.score) desc)
       end "成绩排名"
  from SC t
 group by rollup(t.sno);

这里就是case when和grouping(t.sno)结合使用。

本文发表于2019年05月04日 17:00
(c)注:本文转载自https://my.oschina.net/u/4038621/blog/3044971,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2912 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1