Oracle 9i以后,扩展了group by 的功能,能够满足大部分多维数据的分析统计功能,主要表现:

1. rollup,cube,grouping sets 扩展group by字句提供了丰富的多维分组统计功能;

2. 3个扩展分组函数:grouping,grouping_id,group_id提供扩展group by的辅助功能:提供区别结果行属于哪个分组级别,区分NULL值,建立有意义的报表,对汇总结果排序,过滤结果行等;

3.对扩展group by允许按重复列分组,组合列分组,连接分组等,另外,grouping sets可以接受cube,rollup操作作为参数。

ROLLUP

没有rollup的union all功能

SQL> select a.dname, b.job, sum(b.sal) sum_sal
from scott.dept a, scott.emp b
where a.deptno = b.deptno
group by a.dname, b.job
union all
select a.dname, NULL, sum(b.sa l) sum_sal
from scott.dept a, scott.emp b
where a.deptno = b.deptno
group by a.dnam e
union all
select null, null, sum(b.sal) sum_sal
from scott.dept a, scott.emp b wh ere a.deptno = b.deptno;

显示结果:

DNAME          JOB          SUM_SAL
-------------- --------- ----------
SALES MANAGER 2850
SALES CLERK 950
ACCOUNTING MANAGER 2450
ACCOUNTING PRESIDENT 5000
ACCOUNTING CLERK 1300
SALES SALESMAN 5600
RESEARCH MANAGER 2975
RESEARCH ANALYST 6000
RESEARCH CLERK 1900
ACCOUNTING 8750
RESEARCH 10875 DNAME JOB SUM_SAL
-------------- --------- ----------
SALES 9400
29025 已选择13行。
执行计划
----------------------------------------------------------
Plan hash value: 3113041979 --------------------------------------------------------------------------------
----------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
Time |
--------------------------------------------------------------------------------
----------
| 0 | SELECT STATEMENT | | 19 | 479 | 13 (70)|
00:00:01 |
| 1 | UNION-ALL | | | | |
|
| 2 | HASH GROUP BY | | 14 | 392 | 5 (20)|
00:00:01 |
| 3 | NESTED LOOPS | | 14 | 392 | 4 (0)|
00:00:01 |
| 4 | TABLE ACCESS FULL | EMP | 14 | 210 | 3 (0)|
00:00:01 |
| 5 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 13 | 1 (0)|
00:00:01 |
|* 6 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)|
00:00:01 |
| 7 | HASH GROUP BY | | 4 | 80 | 5 (20)|
00:00:01 |
| 8 | NESTED LOOPS | | 14 | 280 | 4 (0)|
00:00:01 |
| 9 | TABLE ACCESS FULL | EMP | 14 | 98 | 3 (0)|
00:00:01 |
| 10 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 13 | 1 (0)|
00:00:01 |
|* 11 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)|
00:00:01 |
| 12 | SORT AGGREGATE | | 1 | 7 | |
|
|* 13 | TABLE ACCESS FULL | EMP | 14 | 98 | 3 (0)|
00:00:01 |
--------------------------------------------------------------------------------
---------- Predicate Information (identified by operation id):
--------------------------------------------------- 6 - access("A"."DEPTNO"="B"."DEPTNO")
11 - access("A"."DEPTNO"="B"."DEPTNO")
13 - filter("B"."DEPTNO" IS NOT NULL) 统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
53 consistent gets
0 physical reads
0 redo size
780 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
13 rows processed

可以看到,需要多次访问emp,dept表以及dept表的索引。

修改成:

select a.dname, b.job, sum(b.sal) sum_sal
from scott.dept a, scott.emp b
where a.deptno = b.deptno
group by rollup(a.dname, b.job);

结果如下:

DNAME          JOB          SUM_SAL
-------------- --------- ----------
SALES CLERK 950
SALES MANAGER 2850
SALES SALESMAN 5600
SALES 9400
RESEARCH CLERK 1900
RESEARCH ANALYST 6000
RESEARCH MANAGER 2975
RESEARCH 10875
ACCOUNTING CLERK 1300
ACCOUNTING MANAGER 2450
ACCOUNTING PRESIDENT 5000 DNAME JOB SUM_SAL
-------------- --------- ----------
ACCOUNTING 8750
29025
执行计划
----------------------------------------------------------
Plan hash value: 503922295 --------------------------------------------------------------------------------
---------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| T
ime |
--------------------------------------------------------------------------------
---------
| 0 | SELECT STATEMENT | | 14 | 392 | 5 (20)| 0
0:00:01 |
| 1 | SORT GROUP BY ROLLUP | | 14 | 392 | 5 (20)| 0
0:00:01 |
| 2 | NESTED LOOPS | | 14 | 392 | 4 (0)| 0
0:00:01 |
| 3 | TABLE ACCESS FULL | EMP | 14 | 210 | 3 (0)| 0
0:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 13 | 1 (0)| 0
0:00:01 |
|* 5 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 0
0:00:01 |
--------------------------------------------------------------------------------
--------- Predicate Information (identified by operation id):
--------------------------------------------------- 5 - access("A"."DEPTNO"="B"."DEPTNO") 统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
23 consistent gets
0 physical reads
0 redo size
750 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
13 rows processed

已选择13行。

 

 

可见,使用rollup只需要访问emp表一次,通过dept表的主键获得rowid表查询相关行,比union all性能要好。

ORACLE的分组统计之ROLLUP(一)的更多相关文章

  1. oracle中分组中的ROLLUP和CUBE选项

    在进行多列分组统计时,如果直接使用GROUP BY子句指定分组列,则只能生成基于所有分组列的统计结果.如果在GROUP BY子句中使用ROLLUP语句或CUBE语句,除了生成基于所有指定列的分组统计外 ...

  2. ORACLE的分组统计之CUBE(二)

    cube统计包含了rollup的统计结果,而且还有其他组合分组结果(小计),CUBE(n列),那么分组种类有: cube分组就是先进行合计(一个不取),然后小计(到),最后取标准分组. 与rollup ...

  3. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

    原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...

  4. Oracle分组函数之ROLLUP用法

    rollup函数 本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as s ...

  5. Oracle SQL篇(四)group by 分组与分组的加强 rollup

        分组操作group by 和分组的强化(rollup) 分组操作和分组函数的使用,对于编写SQL语句的人来说,是最基本的概念. 我们来看下面的例子: 在这里我们使用员工表EMP scott@D ...

  6. Oracle按不同时间分组统计

    Oracle按不同时间分组统计 Oracle按不同时间分组统计的sql 如下表table1: 日期(exportDate) 数量(amount) -------------- ----------- ...

  7. Oracle数据库从入门到精通-分组统计查询

    视频课程:李兴华 Oracle从入门到精通 视频课程学习者:阳光罗诺 视频来源:51CTO学院 整体内容: 统计函数的使用 分组统计查询的实现 对分组的数据过滤 统计函数 在之前我们就学习过一个COU ...

  8. oracle 高级分组

    oracle 高级分组 博客分类: 数据库基础 oraclesql  10.高级分组 本章目标: 对于增强的group by需要掌握: 1.使用rollup(也就是roll up累计的意思)操作产生s ...

  9. oracle高级分组

    基本group by用法 create table test_table(a varchar(20),b varchar(20),c varchar(20)) insert into test_tab ...

随机推荐

  1. Java数据结构之线性表(2)

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  2. 使用visual studio 2013 快速搭建phonegap开发环境

    前一段时间开发了一款简单的Phonegap应用,遇到了很多坑,其中有一个坑就是在搭建开发环境上.由于Phonegap 2.x 与3.x 区别比较大,导致了开发环境也有所不同.2.x 是这样的http: ...

  3. Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) A. Slime Combining 水题

    A. Slime Combining 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2768 Description Your frien ...

  4. Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索

    D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...

  5. Docker:使用Ambassador进行跨主机间容器通信

    转载请注明出处:点我 由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情.可以利用Ambassador容器来实现这一功能. 基本原理: 利用Ambassador来实现主 ...

  6. 读取svg图片为UIBezierPath,开心做动画

    动画预览 先扯淡 最近手痒又想整点动画玩玩,但是想了几个主意发现稍微复杂一点的手写都一定会累爆.这篇文章记录一下今天折腾的一个方案.说来简单,就是用矢量设计工具舒舒服服的做好设计,然后输出成 svg ...

  7. 对线性回归,logistic回归和一般回归的认识

    原文:http://www.cnblogs.com/jerrylead/archive/2011/03/05/1971867.html#3281650 对线性回归,logistic回归和一般回归的认识 ...

  8. Android点击Button实现功能的几种方法

          Android中Button控件应该算作是比较简单的控件,然而,它的使用频率却是非常的高,今天,我在这里总结了三种常用的点击Button实现其功能的方法.       1.很多时候,我们在 ...

  9. tq2440开发板基本配置

    时钟配置及分配 tq2440的晶振频率是12MHz,在uboot中有如下语句:   #define S3C2440_CLKDIV 0x05 /* FCLK:HCLK:PCLK = 1:4:8, UCL ...

  10. 关于Android WindowManager显示悬浮窗的动画效果

    要实现WindowManager添加的窗口,实现动画显示,就需要添加如下红色的属性,其他的添加View只要设置其Animations属性也会实现动画,当然自己实现也可,但是能直接用系统的已经实现好的, ...