oracle 高效函数,Oracle分组函数之高效的ROLLUP
Oracle/" target=_blank>Oracle分组函数之高效的ROLLUP
㈠ 初始化实验坏境
www.2cto.com
[sql]
hr@ORCL> create table rollup_test as
2 select e.department_id,j.job_title,e.first_name,e.salary
3 from employees e,jobs j
4 where e.job_id=j.job_id;
Table created.
hr@ORCL> select * from rollup_test;
DEPARTMENT_ID JOB_TITLE FIRST_NAME SALARY
------------- ----------------------------------- -------------------- ----------
50 Shipping Clerk Donald 2600
50 Shipping Clerk Douglas 2600
10 Administration Assistant Jennifer 4400
20 Marketing Manager Michael 13000
20 Marketing Representative Pat 6000
40 Human Resources Representative Susan 6500
70 Public Relations Representative Hermann 10000
110 Accounting Manager Shelley 12000
110 Public Accountant William 8300
90 President Steven 24000
90 Administration Vice President Neena 17000
90 Administration Vice President Lex 17000
60 Programmer Alexander 9000
60 Programmer Bruce 6000
60 Programmer David 4800
60 Programmer Valli 4800
60 Programmer Diana 4200
100 Finance Manager Nancy 12000
100 Accountant Daniel 9000
100 Accountant John 8200
100 Accountant Ismael 7700
100 Accountant Jose Manuel 7800
100 Accountant Luis 6900
30 Purchasing Manager Den 11000
30 Purchasing Clerk Alexander 3100
30 Purchasing Clerk Shelli 2900
30 Purchasing Clerk Sigal 2800
30 Purchasing Clerk Guy 2600
30 Purchasing Clerk Karen 2500
50 Stock Manager Matthew 8000
...............................................
...............................................
...............................................
www.2cto.com
㈡ 先看一下普通分组的效果:对DEPARTMENT_ID进行普通的GROUP BY操作---按照小组进行分组
[sql]
hr@ORCL> select department_id,sum(salary) from rollup_test group by department_id;
DEPARTMENT_ID SUM(SALARY)
------------- -----------
100 51600
30 24900
7000
20 19000
70 10000
90 58000
110 20300
50 156400
40 6500
80 304500
10 4400
60 28800
12 rows selected.
㈢ 对DEPARTMENT_ID进行普通的ROLLUP操作---按照小组进行分组,同时求总计
[sql]
hr@ORCL> select department_id,sum(salary) from rollup_test group by rollup(department_id);
DEPARTMENT_ID SUM(SALARY)
------------- -----------
10 4400
20 19000
30 24900
40 6500
50 156400
60 28800
70 10000
80 304500
90 58000
100 51600
110 20300
7000
691400
13 rows selected.
Elapsed: 00:00:00.06
Execution Plan
----------------------------------------------------------
Plan hash value: 3210238927
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 107 | 2782 | 4 (25)| 00:00:01 |
| 1 | SORT GROUP BY ROLLUP| | 107 | 2782 | 4 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL | ROLLUP_TEST | 107 | 2782 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
648 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
㈣ 使用Group By语句翻译一下上面的SQL语句如下(union all一个统计所有数据的行)
[sql]
hr@ORCL> select department_id,sum(salary) from rollup_test group by department_id
2 union all
3 select null, sum(salary) from rollup_test
4 order by 1;
DEPARTMENT_ID SUM(SALARY)
------------- -----------
10 4400
20 19000
30 24900
40 6500
50 156400
60 28800
70 10000
80 304500
90 58000
100 51600
110 20300
7000
691400
13 rows selected.
Elapsed: 00:00:00.02
Execution Plan
----------------------------------------------------------
Plan hash value: 1519347417
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 108 | 2795 | 8 (25)| 00:00:01 |
| 1 | SORT ORDER BY | | 108 | 2795 | 7 (58)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
| 3 | HASH GROUP BY | | 107 | 2782 | 4 (25)| 00:00:01 |
| 4 | TABLE ACCESS FULL| ROLLUP_TEST | 107 | 2782 | 3 (0)| 00:00:01 |
| 5 | SORT AGGREGATE | | 1 | 13 | | |
| 6 | TABLE ACCESS FULL| ROLLUP_TEST | 107 | 1391 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
6 consistent gets
0 physical reads
0 redo size
648 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
㈤ 再看一个ROLLUP两列的情况
[sql]
hr@ORCL> select department_id,job_title,sum(salary) from rollup_test group by rollup(department_id,job_title);
DEPARTMENT_ID JOB_TITLE SUM(SALARY)
------------- ----------------------------------- -----------
Sales Representative 7000
7000
10 Administration Assistant 4400
10 4400
20 Marketing Manager 13000
20 Marketing Representative 6000
20 19000
30 Purchasing Clerk 13900
30 Purchasing Manager 11000
30 24900
40 Human Resources Representative 6500
40 6500
50 Stock Clerk 55700
50 Stock Manager 36400
50 Shipping Clerk 64300
50 156400
60 Programmer 28800
60 28800
70 Public Relations Representative 10000
70 10000
80 Sales Manager 61000
80 Sales Representative 243500
80 304500
90 President 24000
90 Administration Vice President 34000
90 58000
100 Accountant 39600
100 Finance Manager 12000
100 51600
110 Public Accountant 8300
110 Accounting Manager 12000
110 20300
691400
33 rows selected.
Elapsed: 00:00:00.02
Execution Plan
----------------------------------------------------------
Plan hash value: 3210238927
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 107 | 4815 | 4 (25)| 00:00:01 |
| 1 | SORT GROUP BY ROLLUP| | 107 | 4815 | 4 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL | ROLLUP_TEST | 107 | 4815 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
1511 bytes sent via SQL*Net to client
407 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
33 rows processed
㈥ 上面的SQL语句该如何使用Group By进行翻译呢?
[sql]
hr@ORCL> select department_id,job_title,sum(salary) from rollup_test group by department_id,job_title
2 union all
3 select department_id,null,sum(salary) from rollup_test group by department_id
4 union all
5 select null,null,sum(salary) from rollup_test
6 order by 1,2;
DEPARTMENT_ID JOB_TITLE SUM(SALARY)
------------- ----------------------------------- -----------
10 Administration Assistant 4400
10 4400
20 Marketing Manager 13000
20 Marketing Representative 6000
20 19000
30 Purchasing Clerk 13900
30 Purchasing Manager 11000
30 24900
40 Human Resources Representative 6500
40 6500
50 Shipping Clerk 64300
50 Stock Clerk 55700
50 Stock Manager 36400
50 156400
60 Programmer 28800
60 28800
70 Public Relations Representative 10000
70 10000
80 Sales Manager 61000
80 Sales Representative 243500
80 304500
90 Administration Vice President 34000
90 President 24000
90 58000
100 Accountant 39600
100 Finance Manager 12000
100 51600
110 Accounting Manager 12000
110 Public Accountant 8300
110 20300
Sales Representative 7000
691400
7000
33 rows selected.
Elapsed: 00:00:00.02
Execution Plan
----------------------------------------------------------
Plan hash value: 2979879831
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 215 | 7610 | 12 (25)| 00:00:01 |
| 1 | SORT ORDER BY | | 215 | 7610 | 11 (73)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
| 3 | HASH GROUP BY | | 107 | 4815 | 4 (25)| 00:00:01 |
| 4 | TABLE ACCESS FULL| ROLLUP_TEST | 107 | 4815 | 3 (0)| 00:00:01 |
| 5 | HASH GROUP BY | | 107 | 2782 | 4 (25)| 00:00:01 |
| 6 | TABLE ACCESS FULL| ROLLUP_TEST | 107 | 2782 | 3 (0)| 00:00:01 |
| 7 | SORT AGGREGATE | | 1 | 13 | | |
| 8 | TABLE ACCESS FULL| ROLLUP_TEST | 107 | 1391 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
9 consistent gets
0 physical reads
0 redo size
1513 bytes sent via SQL*Net to client
407 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
33 rows processed
㈦ 补充一步,体验一下GROUPING函数的效果
[sql]
SQL> select department_id,job_title,grouping(department_id),grouping(job_title),sum(salary)
2 from rollup_test group by rollup(department_id,job_title);
DEPARTMENT_ID JOB_TITLE GROUPING(DEPARTMENT_ID) GROUPING(JOB_TITLE) SUM(SALARY)
------------- ----------------------------------- ----------------------- ------------------- -----------
Sales Representative 0 0 7000
0 1 7000
10 Administration Assistant 0 0 4400
10 0 1 4400
20 Marketing Manager 0 0 13000
20 Marketing Representative 0 0 6000
20 0 1 19000
30 Purchasing Clerk 0 0 13900
30 Purchasing Manager 0 0 11000
30 0 1 24900
40 Human Resources Representative 0 0 6500
40 0 1 6500
50 Stock Clerk 0 0 55700
50 Stock Manager 0 0 36400
50 Shipping Clerk 0 0 64300
50 0 1 156400
60 Programmer 0 0 28800
60 0 1 28800
70 Public Relations Representative 0 0 10000
70 0 1 10000
80 Sales Manager 0 0 61000
80 Sales Representative 0 0 243500
80 0 1 304500
90 President 0 0 24000
90 Administration Vice President 0 0 34000
90 0 1 58000
100 Accountant 0 0 39600
100 Finance Manager 0 0 12000
100 0 1 51600
110 Public Accountant 0 0 8300
110 Accounting Manager 0 0 12000
110 0 1 20300
1 1 691400
33 rows selected www.2cto.com
看出来什么效果了么?
如果显示“1”表示GROUPING函数对应的列(例如JOB_TITLE字段)是由于ROLLUP函数所产生的空值对应的信息
即对此列进行汇总计算后的结果
如果显示“0”表示此行对应的这列参未与ROLLUP函数分组汇总活动
GROUPING函数可以接受一列,返回0或者1
如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0
GROUPING只能在使用ROLLUP或CUBE的查询中使用
当需要在返回空值的地方显示某个值时,GROUPING()就非常有用
㈧ 小结
ROLLUP在数据统计和报表生成过程中带来极大的便利,而且效率比起来Group By + Union组合方法效率高得多
这也体现了Oracle在SQL统计分析上人性化、自动化、高效率的特点.
oracle 高效函数,Oracle分组函数之高效的ROLLUP相关推荐
- Oracle单组函数、分组函数
文章目录 1.函数基础 1.1SQL函数 1.2两种SQL函数 2.单行函数 2.1说明 2.2字符函数 2.2.1大小写控制函数 2.2.2字符控制函数 2.3数字函数 2.4日期 2.4.1日期的 ...
- MySQL数据处理函数,分组函数,分组查询【MySQL】
Java养成计划----学习打卡第六十六天 内容导航 单行处理函数(续) CONCAT 字符串拼接函数 LENGTH 字符串长度 TRIM 去空格 ROUND 四舍五入 RAND 生成随机数 IFNU ...
- sql中聚合函数和分组函数_SQL选择计数聚合函数-语法示例解释
sql中聚合函数和分组函数 The COUNT operator is usually used in combination with a GROUP BY clause. It is one of ...
- sql中聚合函数和分组函数_学习SQL:聚合函数
sql中聚合函数和分组函数 SQL has many cool features and aggregate functions are definitely one of these feature ...
- oracle 10g学习之分组函数
一. (1)分组查询语句的顺序 select ... from ... where ... group by ... having ... order by ... 注意: where--&g ...
- Oracle——函数(单行函数、分组函数、分析函数)
Oracle SQL 提供了用于执行特定操作的专用函数.这些函数大大增强了 SQL 语言的功能. SQL函数的分类: 单行函数 对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果,可以出现 ...
- oracle之4多行函数之分组函数
常用的分组函数: Sum()求和: 聚合函数Count(*)求个数: Avg()求平均值: 注意:求平均数的方法不同得到的值可能不同. 原因:因为count(*)和count(comm)不相等,cou ...
- oracle之单行函数之分组函数
--分组函数 select avg(salary),max(salary),min(salary),sum(salary) from employees 运行结果 --判断大小 select max( ...
- oraclestddev函数_ORACLE分组函数stddev和variance,我心存的疑问
方差函数VARIANCE(x), 具体方法是: 设方差s,a为x1,x2...xn的平均值 , 则s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+--(xn-a)^2]/n 标准差函数 ...
- mysql中有没有单行函数_MySQL之函数(单行函数、分组函数)
##进阶函数 /* 调用语法:select函数名(实参列表): 分组函数和单行函数的区别: 单行函数:将一个数据进行处理,返回一个值 分组函数:将虚拟表看做一个组,处理一组数据,返回一个值 常见的分组 ...
最新文章
- Datalist控件,Repeater控件如何分页?
- T-Mobile旗下网站又曝安全漏洞 允许任何人查看他人账户信息
- IntelliJ IDEA 快捷键和设置
- OpenCV图像处理实际案例(一)---图像倾斜矫正(仿射变换)和去边(轮廓查找+ROI提取)
- mysql-workbench连接数据库
- 【LeetCode笔记】112 113. 路径总和 I II(Java、递归、DFS)
- IOS7的蛋疼各种收集
- linux脚本awk,如何在awk脚本中使用shell变量?
- ESP32c3开发环境搭建 IDF V4.4离线版安装使用
- 卡巴斯基宣布高端静谧岑寂僻静产物PURE
- js判断是对象还是集合
- LeetCode-11-Container With Most Water
- Linux 脚本获取当前路径父路径及常用命令
- 别再用Excel了!用帆软报表做营收报表效率高十倍!
- 计算机英语课文朗读,倍速英语点读电脑版
- springboot中日志使用
- 股票 市盈率(PE)
- BootStrap 4种图片形式 image形式 img-rounded img-circle img-thumbnail img-responsive
- 《倾城·魅影——CG奇幻插画及技法赏析》—神咒
- Linux下文件的备份
热门文章
- 为项目选择合适的语言
- WPF ListBox(ListView) 自定义 Button 项,获取 ListBox(ListView)的SelectedValue
- OJ1008: 美元和人民币
- OJ1052: 数列求和4(C语言)
- 信息学奥赛一本通(1324:【例6.6】整数区间)
- 信息学奥赛一本通(1400:统计单词数)
- Biorhythms(POJ-1006)
- 信息学奥赛C++语言: 趣味整数5(勾股数)
- 信息学奥赛C++语言:打印字母表
- 信息学奥赛C++语言:三位数的翻转