1. 程式人生 > >[Oracle SQL] 使用rollup分組統計按統計結果分組排序顯示的問題

[Oracle SQL] 使用rollup分組統計按統計結果分組排序顯示的問題

今天想對某些班、課程的掛科人數做統計和小計,使用rollup可以很容易實現這個功能。

比如涉及的成績(all_scores)表結構為

BH 班號
BJMC 班級名稱
KCMC 課程名稱
JD 績點
其中JD為0表示掛科了。我們很容易寫一個分組統計來統計各個班各個課程的掛科人數
select bjmc,
decode(grouping(kcmc),1,'小計',kcmc) kcmc,
sum(decode(jd,0,1,0)) fail_num
from all_scores 
where bh like '201255%'
group by rollup(bjmc,kcmc)

但是我想按班級小計的掛科人數逆序排列,然後再分組的顯示每班每科的掛科人數。

查了一些Oracle的SQL的資料,好像沒有這個對應的函式幫我們實現這個功能,所以想了一個辦法,效率不是很高,但是可以達到目的。

WITH x AS 
         (SELECT bjmc,
                 DECODE (GROUPING (kcmc), 1, '小計', kcmc) kcmc,
                 SUM (DECODE (jd, 0, 1, 0)) fail_num,
                 GROUPING_ID (bjmc, kcmc) gp
            FROM all_scores
           WHERE bh LIKE '201255%'
           GROUP BY ROLLUP (bjmc, kcmc)
          )
  SELECT a.bjmc, a.kcmc, a.fail_num
    FROM x a, x b
   WHERE a.bjmc = b.bjmc AND b.gp = 1
ORDER BY b.fail_num DESC,
         a.bjmc,
         a.gp DESC,
         a.kcmc

思想很簡單,使用grouping_id找出小計的行作為b表,然後對於a表中的每一行,連線到b表對應的小計數。

然後再按我的想法,先按小計數逆序,班級名稱排序。

為了保證小計項為每個塊的第一行,先優先統計行標記即可。