通过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产生统计报告的更多相关文章

  1. 在oracle中,group by后将字符拼接,以及自定义排序

    1.在oracle中,group by后将字符拼接.任务:在学生表中,有studentid和subject两个字段.要求对studentid进行group by分组,并将所选科目拼接在一起.oracl ...

  2. oracle listagg within group

    案例: 查看,每个人身上的标签. 1)表数据 2)SQL select name,listag(tag,',') within group(order by tag) tags from table_ ...

  3. Oracle 中关于 Group By 子句与多行函数嵌套搭配使用的注意事项

    目录 你需要知道的 啥叫单行函数 啥叫多行函数 如何理解这个概念 Group by 子句使用规则 看一道 071 考题 你需要知道的 提到 Group by 子句,你需要先理解一个东西:函数的分类.提 ...

  4. Oracle 表分组 group by和模糊查询like

    分组group by写法 select 字段名 from 表名 group by 字段名 查询这个字段名里的种类分组后可以加聚合函数select 字段名,聚合函数 from 表名 group by 字 ...

  5. oracle having sum group by 详解

    Aggregate functions (like SUM) often need an added GROUP BY functionality. 集合函数(类似SUM)经常需要用GROUP BY来 ...

  6. oracle select非group by的字段

    可以把group by的结果集当作一个表,然后从这里表里取数就可以了. e.g. SELECT A.PROJECT_CODE,A.DIE_NO,E.ONE_CONSUMING FROM (SELECT ...

  7. Oracle子句【group by、having】

    [分组查询]关键字:group by 分组字段名,分组字段名... --注意1:分组后,在select语句中只允许出现分组字段和多行函数 --注意2:如果是多字段分组,先按第一字段分组,然后每个小组继 ...

  8. (转)oracle group by 和order by的关系(在一起使用注意事项)

    转:http://lzfhope.blog.163.com/blog/static/636399220092554045196/ 环境:oracle 10g单单group by 或者order by本 ...

  9. 开发中mysql和oracle的区别

    首先就不描述mysql与oracle在整个数据库系统上的区别了,仅从程序员开发的角度来说: 1.主键: mysql一般会用到一个自增的属性,例如设置一个id字段,类型设置为auto increment ...

随机推荐

  1. Hyperledger Fabric介绍

    转载地址 https://blog.csdn.net/xiaonu123/article/details/81006936 简介 Hyperledger介绍 超级账本(Hyperledger)项目是首 ...

  2. 聊聊mysql中的int(1)

    昨天有个读者问了我这样一个问题在mysql中建表的时候,我设置一个字段为int类型,长度为1,但是我发现这个字段却可以存储任意长度的数字,这是什么情况?这个问题在我刚接触数据库的时候也遇到过,我觉得有 ...

  3. Android Studio gridview 控件使用自定义Adapter, 九宫格items自适应全屏显示

    先看效果图,类似于支付宝首页的效果.由于九宫格显示的帖子网上已经很多,但是像这样九宫格全屏显示的例子还不是太多.本实例的需求是九宫格全屏显示,每个子view的高度是根据全屏高度三等分之后自适应高度,每 ...

  4. 细讲前端设置cookie, 储存用户登录信息

    细讲前端设置cookie 引言 正文 一.设置cookie 二.查看cookie 三.删除cookie 四.封装cookie操作 结束语 引言 我们都知道如果想做一个用户登录并使浏览器保存其登录信息, ...

  5. Understanding dopamine and reinforcement learning: The dopamine reward prediction error hypothesis

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 在中脑多巴胺能神经元的研究中取得了许多最新进展.要了解这些进步以及它们之间的相互关系,需要对作为解释框架并指导正在进行的 ...

  6. python open函数初习

    open("路径","打开方式")  打开方式:'r'只读模式,‘w’写模式,‘a’追加模式 ‘b’二进制模式,‘+’读/写模式.例: fh=open(&quo ...

  7. ACM study day3

    今天练了二分和快速幂,题目挺难的,挑几个我做上的说一下吧. 先给出几个二分和快速幂的模板函数: 二分 void BS(int m) { int x=,y=a[m-]-a[]; while(y-x> ...

  8. [QZOI2019]Game 题解

    QZOI2019 CSP-S模拟赛 T1 错误的贪心导致考场上只有10pts... 看来以后贪心还是需要先证明啊 题目描述 小A和小B在玩一个游戏,他们两个人每人有 $n$ 张牌,每张牌有一个点数,并 ...

  9. 焦大:seo该研究用户需求还是搜索算法

    http://www.wocaoseo.com/thread-62-1-1.html 上一篇博客我写了用户需求点是做seo排名最首要关注的东西,其实这个我在以前也一直说的,seo有两大核心,一个是检索 ...

  10. 焦大:seo思维光年(下)seo操作如何度量化

    http://www.wocaoseo.com/thread-57-1-1.html 如果不能度量就无法进行改进,所以度量化或数据化是网站分析和网站研究必须进行的一个方面,seo也不能例外.我在上篇文 ...