oracle中rollup的使用(rollup和rank的结合使用)
1.rollup的作用
用来对每个分组的数据进行小计或者合计。
2.求每个学生的所有课程成绩的平均分
1)使用pl/sql查询SC表,这个表是安装oracle时默认安装的scott用户下的表。
2)查询每个学生的平均成绩
3.统计所有学生的平均成绩
那我们如何将每个学生的平均成绩和所有学生的平均成绩放在一个查询结果里呢?这就需要使用到rollup函数。
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)值倒序排列。
如果我想把所有学生的平均成绩放进这个查询结果里可以吗?我们试试。
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);
我想把统计结果排除在排序函数外怎么办?也就是我只想让每个学生按照平均成绩排序,所有学生的平均成绩不计入排序函数。
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)进行分组。
grouping函数解释: 如果显示“1”表示GROUPING函数对应的列(例如sno字段)是由于ROLLUP函数所产生的空值对应的信息,即对此列进行汇总计算后的结果。
如果显示“0”表示此行对应的这列参未与ROLLUP函数分组汇总活动。
我们这样理解:使用rollup函数后,在统计列(如sno字段)上使用grouping函数后,合计行和非合计行的返回值不一样。我们就可以使用grouping(t.sno)进行分组。
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)结合使用。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
死磕 java集合之LinkedList源码分析
问题 (1)LinkedList只是一个List吗? (2)LinkedList还有其它什么特性吗? (3)LinkedList为啥经常拿出来跟ArrayList比较? (4)我为什么把LinkedList放在最后一章来讲? 简介 LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。 继承体系 通过继承体系,我们可以看到LinkedList不仅实现了List接口,还实现了Queue和Deque接口,所以它既能作为List使用,也能作为双端队列使用,当然也可以作为栈使用。 源码分析 主要属性 // 元素个数 transient int size = 0; // 链表首节点 transient Node<E> first; // 链表尾节点 transient Node<E> last; 属性很简单,定义了元素个数size和链表的首尾节点。 主要内部类 典型的双链表结构。 private static class Node<E> { E item; Node<...
- 下一篇
再谈Java 生产神器 BTrace
本文首发于个人公众号《andyqian》,期待你的关注~ 前言 在上一篇文章《Java 生产神器 BTrace》中我们认识了BTrace,并了解到 BTrace 脚本如何编写,如何执行,不熟悉的朋友,也可以对着文章照葫芦画瓢。但对于我们技术人来说,仅有这些是不够的,我们必须弄清楚每一个参数的意义,用法,才能百变不离其宗。另外,在这基础之上,还有一些更高阶的用法也是需要我们掌握的。 用法 在 BTrace 的用户指南中,将 BTrace 的常用用法分为类注解,方法注解,方法参数注解,它们各司其职,构造成了BTrace。下面分别介绍其使用方法: 类注解 @BTrace 注解的作用域为类,我们可以理解像Java类中的 class 关键字一样的作用。作用域与之类似的还有:DTrace,DTraceRef,这两个注解涉及到另外一种脚本语言,且不常用,不在本文中展开。 方法注解 @com.sun.btrace.annotations.OnMethod 在方法注解中,最常见的莫过于@OnMethod,顾名思义,该注解作用于trace方法上。在该注解中,有三个非常重要的属性: clazz 表示我们需...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题