Oracle学习记录 十 高级分组学习

  1. group by cube

先执行一个语句看一下:

select deptno, job, sum(sal) sal from emp

group by cube(deptno, job)

order by sal;

这个输出结果可以看到,有deptno为空的,有job为空的,还有都为空的,当然还有两者都有的。

http://honeybinshun.iteye.com/blog/1474242

先对deptno,job进行group by 这个就是两者都有的那些项,然后对deptno进行group by,这个就是只有deptno那些项,

然后对job进行group by,这个就是只有job的那些项,然后还会求一次不group by 的,就是两者都为空的那项。

2. group by rollup

先执行一下这个:

select deptno, job, sum(sal) sal from emp

group by cube(deptno, job)

order by sal;

这里结果中有deptno,job都有的项,有只有deptno的项,还有两者都没有的项

执行是这样的,先对deptno,job进行group by,这样产生两者都有的项,然后对deptno执行group by,这样

产生只有deptno的项,然后还有一个是不group by 的,就是两者都为空的那项

其中,cube和rollup中可以有多个元素,

cube(A,B,C):(A,B,C)(A,B),(A,C),(A),(B,C),(B),(C)  这是它的group by情况 外加一次不group by

rollup(A,B,C): (A,B,C) (A,B) (A) 这是它的group by 情况,外加一次不group by的

3. grouping

这个是用来检查一行数据是否是cube产生的NULL,什么情况下需要这个呢?

想一下,刚才例子中,有时候是两者都有的项,有些是只有一者的项,那么,如果在原数据中,就是只有一者呢,

这样就无法区别开是原数据,还是聚合后的数据了,所以用grouping来区别,是就返回1,不是就返回0

http://www.cnblogs.com/li-peng/p/3298303.html

select deptno, job, sum(sal) sal, decode(grouping(deptno), 1, ‘Y‘, ‘N‘)

from emp

group by cube(deptno, job)

order by sal;

在这个结果中,只有deptno显示为空的项后面是Y,其他的都是N,这是因为本身deptno原数据中就没有是NULL的

显示Y的是因为现在deptno是NULL,说明是聚合产生的,显示N是因为这不是聚合产生的NULL或者这个根本不是NULL,

在这里就是因为deptno的值不是NULL,所以后面显示了N。

时间: 2024-08-11 03:02:16

Oracle学习记录 十 高级分组学习的相关文章

APUE 学习笔记(十) 高级I/O

1. Unix IPC(InterProcess Communication) 同一主机的各个进程间的IPC:管道.FIFO.消息队列.信号量.共享存储器 不同主机上的各个进程间IPC:socket套接字 2. 管道 管道进行IPC有两个局限: (1) 半双工,即数据只能在一个方向上流动 (2) 只能在具有公共祖先的进程之间使用.通常,一个管道由一个进程创建,然后该进程调用fork,此后 父子进程之间可以使用该管道 fstat函数对管道的每一端都返回一个FIFO类型的文件描述符,可以用S_ISF

webpack学习记录(十二)-区分不同环境

webpack学习记录(十二)-区分不同环境 定义全局变量 使用webpack内置的插件DefinePlugin 允许创建一个在编译时可以配置的全局常量. 用法 //在webpack.config.js中配置插件 new webpack.DefinePlugin({ PRODUCTION: JSON.stringify(true) }) //在index.js中使用定义的变量 if (!PRODUCTION) { console.log('Debug info') } if (PRODUCTIO

webpack学习记录(十)-跨域

webpack学习记录(十)-跨域 准备工作 建一个简单的服务端 const express = require('express') let app = express() app.get('/api/user', (req,res) => { res.json({msg:'服务器启动'}) ) app.listen(3000) 发送一个请求 let xhr = new XMLHttpRequest() xhr.open('get','/api/user',true) xhr.onload =

[转]Oracle学习记录 九 Prc C学习

经过前面的了解,现在想用C语言来编程了,搜索了很多东西,后来决定先用Pro C来进行学习 在安装完Oracle数据库后就可以进行编程了,里面有一个命令proc就是对程序进行预编译的. 在这记一下,这是一个学习PL/SQL的网站,挺好的 http://www.cnblogs.com/huyong/archive/2012/07/30/2614563.html 创建用户是 create user xx identified by xx account unlock; grant connect, r

Mybatis学习记录(四)--高级查询和缓存

这些都是连贯的学习笔记,所以有的地方因为之前都说过,所以也就没怎么写详细了,看不太明白的可以看看之前的笔记. 一.高级查询 高级查询主要是一对一查询,一对多查询,多对多查询 1.一对一查询 有用户和订单两个表,用户对订单是1对1查询.也就是订单中有一个外键是指向用户的. 先创建实体类: User.java public class User { private int id; private String username; private String password; private St

Oracle学习记录 六 又一本学习资料练习

学习过最简单的几种语句了,也安装过了几次数据库,本来在看那个高级编程的,但是还有一本入门的没看,就先看了再说, 多练习,熟悉掌握最基本的操作. 我以前登录的时候都是用conn回车,然后再输入密码,这个文档第一个就介绍了另一种登录方法. conn scott/xx 这样就直接登录了,/前是用户名,/后是密码 conn sys/xx as sysdba 这个就是用管理员登录 2. 然后是把刚才输入的sql保存成文件用.sql后缀 select * from emp; save /home/oracl

Oracle学习记录 九 Prc C学习

经过前面的了解,现在想用C语言来编程了,搜索了很多东西,后来决定先用Pro C来进行学习 在安装完Oracle数据库后就可以进行编程了,里面有一个命令proc就是对程序进行预编译的. 写一个test.pc然后 proc iname=test.pc oname=test.c 但是我这怎么也不行,一直出问题 后来我用 proc PARSE=NONE CODE=KR_C LINE=YES INAME=test.pc MODE=ORACLE DBMS=V8 UNSAFE_NULL=YES 这下才生成了t

Spring学习记录(十四)---JDBC基本操作

先看一些定义: 在Spring JDBC模块中,所有的类可以被分到四个单独的包:1.core即核心包,它包含了JDBC的核心功能.此包内有很多重要的类,包括:JdbcTemplate类.SimpleJdbcInsert类,SimpleJdbcCall类,以及NamedParameterJdbcTemplate类.2.datasource即数据源包,访问数据源的实用工具类.它有多种数据源的实现,可以在JavaEE容器外部测试JDBC代码.3.object即对象包,以面向对象的方式访问数据库.它允许

Spring学习记录(十二)---AOP理解

Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 专业术语: Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spri