用來對每一個分組的數據進行小計或者合計。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)結合使用。排序