用来对每一个分组的数据进行小计或者合计。sql
那咱们如何将每一个学生的平均成绩和全部学生的平均成绩放在一个查询结果里呢?这就须要使用到rollup函数。oracle
select t.sno, avg(t.score) from SC t group by rollup(t.sno);
上一个查询结果第5行的SNO字段是空的,须要咱们填入默认值。这里能够使用nvl函数。函数
select nvl(t.sno,'全部学生'), avg(t.score) from SC t group by rollup(t.sno);
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)值倒序排列。
若是我想把全部学生的平均成绩放进这个查询结果里能够吗?咱们试试。spa
select nvl(t.sno,'全部学生'), avg(t.score) "平均分", rank() over(order by avg(t.score) desc) "成绩排名" from SC t group by rollup(t.sno);
我想把统计结果排除在排序函数外怎么办?也就是我只想让每一个学生按照平均成绩排序,全部学生的平均成绩不计入排序函数。3d
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)进行分组。code
grouping函数解释: 若是显示“1”表示GROUPING函数对应的列(例如sno字段)是因为ROLLUP函数所产生的空值对应的信息,即对此列进行汇总计算后的结果。
若是显示“0”表示此行对应的这列参未与ROLLUP函数分组汇总活动。
咱们这样理解:使用rollup函数后,在统计列(如sno字段)上使用grouping函数后,合计行和非合计行的返回值不同。咱们就能够使用grouping(t.sno)进行分组。blog
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)结合使用。排序