[Oracle SQL] 使用rollup分组统计按统计结果分组排序显示的问题
2014-02-23 17:30
441 查看
今天想对某些班、课程的挂科人数做统计和小计,使用rollup可以很容易实现这个功能。
比如涉及的成绩(all_scores)表结构为
其中JD为0表示挂科了。我们很容易写一个分组统计来统计各个班各个课程的挂科人数
但是我想按班级小计的挂科人数逆序排列,然后再分组的显示每班每科的挂科人数。
查了一些Oracle的SQL的资料,好像没有这个对应的函数帮我们实现这个功能,所以想了一个办法,效率不是很高,但是可以达到目的。
思想很简单,使用grouping_id找出小计的行作为b表,然后对于a表中的每一行,连接到b表对应的小计数。
然后再按我的想法,先按小计数逆序,班级名称排序。
为了保证小计项为每个块的第一行,先优先统计行标记即可。
比如涉及的成绩(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表对应的小计数。
然后再按我的想法,先按小计数逆序,班级名称排序。
为了保证小计项为每个块的第一行,先优先统计行标记即可。
相关文章推荐
- oracle sql合计结果信息使用分组的小问题
- oracle 显示多个分组的统计结果 GROUPING SETS
- 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
- 数据库SQL中对查询结果排序排列序号编号,Oracle分析函数 rank,dense_rank,row_number使用和区别
- 最常用的SQL排序、分组与统计的使用方法
- 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 【SQL*Plus】使用BREAK和COMPUTE在SQL*Plus中得到分组统计结果
- 出现的问题: A、使用命令行无法登录oracle或者显示ORA-01109:数据库未打开; B、使用PL/SQL登录出现 ORA-01033:ORACLE initialization or
- 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
- Sql常见问题总结二(Sql语句怎么样查询IP,游标去重复,各种函数使用,各种取时间格式,字符串精确排序,超时锁问题)
- 使用dataframe解决spark TopN问题:分组、排序、取TopN和join相关问题
- 关于统计的一个sql问题,使用动态sql语句实现。
- 在oracle中使用having关键字来限制你的分组结果
- Oracle--sqlplus如何设置SQLPlus结果显示的宽度
- SQL 分组查询,把纵向显示的结果变成横向显示
- oracle 数据库的管理工具 PL/SQL_Developer 的简易使用 与Java 连接并查询显示出数据
- 使用RDD解决spark TopN问题:分组、排序、取TopN
- SQL分页排序的实现与分页数据重复问题——以Oracle rownum为例