[Oracle SQL] 使用rollup分組統計按統計結果分組排序顯示的問題
阿新 • • 發佈:2019-01-25
今天想對某些班、課程的掛科人數做統計和小計,使用rollup可以很容易實現這個功能。
比如涉及的成績(all_scores)表結構為
BH | 班號 |
BJMC | 班級名稱 |
KCMC | 課程名稱 |
JD | 績點 |
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表對應的小計數。
然後再按我的想法,先按小計數逆序,班級名稱排序。
為了保證小計項為每個塊的第一行,先優先統計行標記即可。