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

1.rollup的做用

用來對每一個分組的數據進行小計或者合計。sql

2.求每一個學生的全部課程成績的平均分

1)使用pl/sql查詢SC表,這個表是安裝oracle時默認安裝的scott用戶下的表。

2)查詢每一個學生的平均成績

3.統計全部學生的平均成績

那咱們如何將每一個學生的平均成績和全部學生的平均成績放在一個查詢結果裏呢?這就須要使用到rollup函數。oracle

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)值倒序排列。
若是我想把全部學生的平均成績放進這個查詢結果裏能夠嗎?咱們試試。spa

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);


我想把統計結果排除在排序函數外怎麼辦?也就是我只想讓每一個學生按照平均成績排序,全部學生的平均成績不計入排序函數。3d

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)進行分組。code

grouping函數解釋: 若是顯示「1」表示GROUPING函數對應的列(例如sno字段)是因爲ROLLUP函數所產生的空值對應的信息,即對此列進行彙總計算後的結果。
若是顯示「0」表示此行對應的這列參未與ROLLUP函數分組彙總活動。
咱們這樣理解:使用rollup函數後,在統計列(如sno字段)上使用grouping函數後,合計行和非合計行的返回值不同。咱們就能夠使用grouping(t.sno)進行分組。blog

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)結合使用。排序

相關文章
相關標籤/搜索