oracle之通过group by产生统计报告
通过group by产生统计报告
Oracle数据库中的ROLLUP配合group by命令使用,可以提供信息汇总功能(与"小计"相似)
CUBE,也是GROUP BY子句的一种扩展,可以返回每一个列组合的小计记录,同时在末尾加上总计记录。
group by有关知识点:
1)group by rollup
2)group by cube
3)grouping和grouping_id函数
4)grouping set
示例如下:
SQL> select job,deptno,sum(sal) total_sal from emp group by (job,deptno);
JOB DEPTNO TOTAL_SAL
--------- ---------- ----------
MANAGER 20 2975
PRESIDENT 10 5000
CLERK 10 1300
SALESMAN 30 5600
ANALYST 20 6000
MANAGER 30 2850
MANAGER 10 2450
CLERK 30 950
CLERK 20 1900
已选择9行。
18.1 rollup的用法
SQL> select job,deptno,sum(sal) total_sal from emp group by rollup(job,deptno);
JOB DEPTNO TOTAL_SAL
--------- ---------- ----------
CLERK 10 1300
CLERK 20 1900
CLERK 30 950
CLERK 4150
ANALYST 20 6000
ANALYST 6000
MANAGER 10 2450
MANAGER 20 2975
MANAGER 30 2850
MANAGER 8275
SALESMAN 30 5600
SALESMAN 5600
PRESIDENT 10 5000
PRESIDENT 5000
29025
15 rows selected.
18.2 cube的用法
SQL> select job,deptno,sum(sal) total_sal from emp group by cube(job,deptno);
JOB DEPTNO TOTAL_SAL
--------- ---------- ----------
29025
10 8750
20 10875
30 9400
CLERK 4150
CLERK 10 1300
CLERK 20 1900
CLERK 30 950
ANALYST 6000
ANALYST 20 6000
MANAGER 8275
MANAGER 10 2450
MANAGER 20 2975
MANAGER 30 2850
SALESMAN 5600
SALESMAN 30 5600
PRESIDENT 5000
PRESIDENT 10 5000
18 rows selected.
可以看出,用了rollup的group by子句所产生的所谓的超级聚合就是指在在产生聚合时会从右向左逐个对每一列进行小结,并在结果中生成独立的一行,同时也会对聚合列生成一个合计列。
这里的group by后面我们仅仅接了2列,实际上我们可以使用更多列的,这样的话oracle就会以从右向左的方式来进行逐个小结。
这里需要注意的是使用了group by和rollup后,其后面的列要用括号括起来,否则将会出现ORA-00933: SQL 命令未正确结束的错误。
看看grouping、grouping_id函数是什么?
18.3 grouping函数和grouping_id函数
GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。
GROUPING函数可以返回0,1,2,3...可以分别表示小计,合计等信息。
SQL>
SQL> select job,deptno,sum(sal) total_sal,grouping(job) job_grp, grouping(deptno) deptno_grp,grouping_id(job,deptno) total_grp from emp group by cube(job,deptno);
JOB DEPTNO TOTAL_SAL JOB_GRP DEPTNO_GRP TOTAL_GRP
--------- ---------- ---------- ---------- ---------- ----------
29025 1 1 3
10 8750 1 0 2
20 10875 1 0 2
30 9400 1 0 2
CLERK 4150 0 1 1
CLERK 10 1300 0 0 0
CLERK 20 1900 0 0 0
CLERK 30 950 0 0 0
ANALYST 6000 0 1 1
ANALYST 20 6000 0 0 0
MANAGER 8275 0 1 1
MANAGER 10 2450 0 0 0
MANAGER 20 2975 0 0 0
MANAGER 30 2850 0 0 0
SALESMAN 5600 0 1 1
SALESMAN 30 5600 0 0 0
PRESIDENT 5000 0 1 1
PRESIDENT 10 5000 0 0 0
已选择18行。
但是我们大多数情况下需要在查询的结果集的汇总列加上“合计”,怎么办呢?用grouping和grouping_id函数,然后再用decode函数判断一下是否为空就可以了
SQL>select grouping_id(job,deptno) as group_col,sum(sal) total_sal from emp group by rollup(job,deptno);
GROUP_COL TOTAL_SAL
---------- ----------
0 1300
0 1900
0 950
1 4150
0 6000
1 6000
0 2450
0 2975
0 2850
1 8275
0 5600
1 5600
0 5000
1 5000
3 29025
已选择15行。
SQL>select decode(grouping_id(job,deptno),1,'合计',3,'总计',job||deptno) as group_col,sum(sal) total_sal
from emp group by rollup(job,deptno);
GROUP_COL TOTAL_SAL
------------------------------------------------- ----------
CLERK10 1300
CLERK20 1900
CLERK30 950
合计 4150
ANALYST20 6000
合计 6000
MANAGER10 2450
MANAGER20 2975
MANAGER30 2850
合计 8275
SALESMAN30 5600
合计 5600
PRESIDENT10 5000
合计 5000
总计 29025
18.4 grouping sets
grouping sets用于在一个select语句中定义多个grouping, 相当于将grouping set中的多个grouping组合后再UNION ALL。
例1
SELECT null,job,mgr, AVG(sal)
FROM emp
GROUP BY(job,mgr)
union all
SELECT deptno, job, null,AVG(sal)
FROM emp
GROUP by (deptno,job);
例2=例1, 但使用了grouping sets
SELECT deptno,job,mgr, AVG(sal)
FROM emp
GROUP BY grouping sets ((deptno,job),(job,mgr));
DEPTNO JOB MGR AVG(SAL)
---------- --------- ---------- ----------
CLERK 7902 800
PRESIDENT 5000
CLERK 7698 950
CLERK 7788 1100
CLERK 7782 1300
SALESMAN 7698 1400
MANAGER 7839 2758.33333
ANALYST 7566 3000
20 CLERK 950
30 SALESMAN 1400
20 MANAGER 2975
30 CLERK 950
10 PRESIDENT 5000
30 MANAGER 2850
10 CLERK 1300
10 MANAGER 2450
20 ANALYST 3000
已选择17行。
Oracle给出了一个小表,可以表明grouping sets和 union all的关系:
GROUPING SETS Statements Equivalent GROUP BY Statements
-------------------------------------------------------------------------------
GROUP BY GROUPING SETS(a, b, c) GROUP BY a UNION ALL
GROUP BY b UNION ALL
GROUP BY c
GROUP BY GROUPING SETS(a, b,(b, c)) GROUP BY a UNION ALL
GROUP BY b UNION ALL
GROUP BY b, c
GROUP BY GROUPING SETS((a, b, c)) GROUP BY a, b, c
GROUP BY GROUPING SETS(a, (b), ()) GROUP BY a UNION ALL
GROUP BY b UNION ALL
GROUP BY ()
GROUP BY GROUPING SETS(a,ROLLUP(b, c)) GROUP BY a UNION ALL
GROUP BY ROLLUP(b, c)
oracle之通过group by产生统计报告的更多相关文章
- 在oracle中,group by后将字符拼接,以及自定义排序
1.在oracle中,group by后将字符拼接.任务:在学生表中,有studentid和subject两个字段.要求对studentid进行group by分组,并将所选科目拼接在一起.oracl ...
- oracle listagg within group
案例: 查看,每个人身上的标签. 1)表数据 2)SQL select name,listag(tag,',') within group(order by tag) tags from table_ ...
- Oracle 中关于 Group By 子句与多行函数嵌套搭配使用的注意事项
目录 你需要知道的 啥叫单行函数 啥叫多行函数 如何理解这个概念 Group by 子句使用规则 看一道 071 考题 你需要知道的 提到 Group by 子句,你需要先理解一个东西:函数的分类.提 ...
- Oracle 表分组 group by和模糊查询like
分组group by写法 select 字段名 from 表名 group by 字段名 查询这个字段名里的种类分组后可以加聚合函数select 字段名,聚合函数 from 表名 group by 字 ...
- oracle having sum group by 详解
Aggregate functions (like SUM) often need an added GROUP BY functionality. 集合函数(类似SUM)经常需要用GROUP BY来 ...
- oracle select非group by的字段
可以把group by的结果集当作一个表,然后从这里表里取数就可以了. e.g. SELECT A.PROJECT_CODE,A.DIE_NO,E.ONE_CONSUMING FROM (SELECT ...
- Oracle子句【group by、having】
[分组查询]关键字:group by 分组字段名,分组字段名... --注意1:分组后,在select语句中只允许出现分组字段和多行函数 --注意2:如果是多字段分组,先按第一字段分组,然后每个小组继 ...
- (转)oracle group by 和order by的关系(在一起使用注意事项)
转:http://lzfhope.blog.163.com/blog/static/636399220092554045196/ 环境:oracle 10g单单group by 或者order by本 ...
- 开发中mysql和oracle的区别
首先就不描述mysql与oracle在整个数据库系统上的区别了,仅从程序员开发的角度来说: 1.主键: mysql一般会用到一个自增的属性,例如设置一个id字段,类型设置为auto increment ...
随机推荐
- Java中的注解及自定义注解你用的怎么样,能不能像我这样应用自如?
Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...
- C++指针变量的基本写法
指针变量与应用——动态数组 在C++中,有一种神奇的变量,它不可以表示一个值,但是可以表示某个元素的地址,通过地址来访问这个元素. 打个比方:你有一张地图和一个坐标,你就可以通过访问这个坐标来达到你访 ...
- STL函数库的应用第四弹——全排列(+浅谈骗分策略)
因为基础算法快学完了,图论又太难(我太蒻了),想慢慢学. 所以暂时不写关于算法的博客了,但又因为更新博客的需要,会多写写关于STL的博客. (毕竟STL函数库还是很香的(手动滑稽)) 请出今天主角:S ...
- Python 常用的操作文件代码
1:统计list中相同的个数,并按大小排序. original_list = ['a', 'b', 'b', 'a', 'd', 'd', 'b', 'z', 'c', 'b', 'r', 's', ...
- 数值分析案例:Newton插值预测2019城市(Asian)温度、Crout求解城市等温性的因素系数
数值分析案例:Newton插值预测2019城市(Asian)温度.Crout求解城市等温性的因素系数 文章目录 数值分析案例:Newton插值预测2019城市(Asian)温度.Crout求解城市等温 ...
- Java成员变量和局部变量的区别
定义位置不同: 成员变量:类中方法外 分为类变量(static修饰).实例变量(没有使用static修饰) 局部变量:方法内.代码块内 默认值不同: 成员变量:有默认初始化值 局部变量:没有默认初始化 ...
- windows操作报错:无法启动此程序,因为计算机中丢失api-ms-win-core-winrt-string-l1-1-0.dll
在Windows上做提交svn操作时报错:无法启动此程序,因为计算机中丢失api-ms-win-core-winrt-string-l1-1-0.dll,如下图: 解决办法: 在 https://cn ...
- 【翻译】.NET 5 Preview8发布
[翻译].NET 5 Preview8发布 今天,.NET 5预览8发布了,对于.NET5.0的功能开发已经完成了,这必须要排除待处理的bug,预览8是最后一次预览版本.预计11月正式的.NET5.0 ...
- idea,git操作
原文地址:https://blog.csdn.net/lzx2018/article/details/91414591 1新建分支 点击New Branch 2切换分支
- css面试题汇总 (持续更新)
前言:这篇随笔是为了准备后面的面试而整理的,网上各种面试题太多了,但是我感觉很多太偏了,而且实际开发过程中并不会遇到,因此这里我整理一些比较常用的,或者是相对比较重要的知识点,每个知识点都会由浅入深, ...