oracle 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表对应的小计数。

然后再按我的想法,先按小计数逆序,班级名称排序。

为了保证小计项为每个块的第一行,先优先统计行标记即可。

原文:http://blog.csdn.net/ericxieforever/article/details/19762501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值