博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle高级分组
阅读量:5150 次
发布时间:2019-06-13

本文共 1982 字,大约阅读时间需要 6 分钟。

1.ROLLUP

 

ROLLUP的作用相当于

SQL> set autotrace on
SQL> select department_id,job_id,count(*)
  2  from employees
  3  group by department_id,job_id
  4  union
  5  select department_id,null,count(*)
  6  from employees
  7  group by department_id
  8  union
  9  select null,null,count(*)
 10  from employees;

最后面的SA_REP表示此jobid没有部门,为null

这里的union系统默认进行了排序

使用ROLLUP能达到上面GROUP BY的功能,但性能开销更小

SQL> ed
已写入 file afiedt.buf
  1  select department_id,job_id,count(*)
  2  from employees
  3* group by rollup (department_id,job_id)
SQL> /

2.为什么ROLLUP会比GROUP BY性能好

ROLLUP(a,b,c)=a,b,c+a,b+a+All

通过一次全表扫描,得出a,b,c的分组统计信息后;分组统计a,b 相同,c不同的项即可得到a,b;依此类推……,就不用去多次全表扫描

 

3.ROLLUP的另类用法ROLLUP(a,(b,c))

ROLLUP((a,b))
SQL> ed
已写入 file afiedt.buf

  1  select department_id,job_id,count(*)

  2  from employees
  3* group by rollup ((department_id,job_id))
SQL> /
注意面的语句是group by rollup ((department_id,job_id))
不是group by rollup (department_id,job_id)

 

4.GROUPING函数的作用是放总记

如一个公司有多个部门,一个部门有多个岗位,一个岗位上有多个人

Rollup(部门,工作岗位)  sum(每人的工资)
当部门的GROUPING为0,工作岗位的GROUPING也为0时,说明是公司发的总工资,此时放公司总计
当部门的GROUPING为0,工作岗位的GROUPING也为1时,说明是部门发的总工资,此时放部门小记
当部门的GROUPING为1,工作岗位的GROUPING也为1时,显示的是某部门某职位的工资和计
SQL> SELECT   department_id DEPTID, job_id JOB,
  2           SUM(salary),
  3           GROUPING(department_id) GRP_DEPT,
  4           GROUPING(job_id) GRP_JOB
  5  FROM     employees
  6  GROUP BY ROLLUP(department_id, job_id);

第一个SA_REP表示此jobid没有部门,为null

 

5.GROUPING SETS与GROUPING的作用是不同的

 

Oracle服务器计算GROUPING SETS子句中所有的组并将结果通过UNION ALL组合成一个结果集.

GROUPING SETS的效果:1.只需要访问一次基表.2.不需要写很复杂的UNION语句.
SELECT   department_id, job_id, null manager_id,avg(salary)
FROM     employees
GROUP BY (department_id,job_id)
UNION ALL
SELECT   null department_id, job_id, manager_id,avg(salary)
FROM     employees
GROUP BY (job_id,manager_id)
等同于
SQL> set autotrace on
SQL> SELECT   department_id, job_id,
  2           manager_id,avg(salary)
  3  FROM     employees
  4  GROUP BY GROUPING SETS ((department_id,job_id), (job_id,manager_id));

上面得到的是通过job_id,manager_id分组的avg(salary)

下面的是通过department_id,job_id分组的avg(salary)

 

转载于:https://www.cnblogs.com/bolang100/p/6530301.html

你可能感兴趣的文章
Ajax.BeginForm 上传文件
查看>>
第6章 Overlapped I/O, 在你身后变戏法 ---被激发的 Event 对象 -4
查看>>
植物大战僵尸中文年度版
查看>>
26、linux 几个C函数,nanosleep,lstat,unlink
查看>>
001.RAID简介
查看>>
投标项目的脚本练习2
查看>>
第五次实验
查看>>
201521123107 《Java程序设计》第9周学习总结
查看>>
runtime的基本应用
查看>>
localStorage,最简单的历史记录
查看>>
关于scrollTop的那些事
查看>>
Caroline--chochukmo
查看>>
算法导论笔记 第8章 线性时间排序
查看>>
利用jquery的contains实现搜索功能
查看>>
Xcode 6.2 beta 3 太难下载!下载了,不敢独享
查看>>
并发编程
查看>>
Django框架(七)
查看>>
Linux文件系统概述
查看>>
ffmpeg-php
查看>>
别把淘宝客当傻子
查看>>