• oralce分析函数group by || rollup || cude || grouping || grouping sets


    1、group by的使用

    --根据DEPTNO和JOB进行分组。求相同DEPTNO,相同JOB的员工工资总和。

    SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY E.DEPTNO,E.JOB
    ORDER BY E.DEPTNO

    结果:

    2、group by 配合rollup的使用

    rollup()--可以使用一个或者多个参数。意思是从右向左进行数据的汇总统计,并生成一行,rollup是个统计函数。

    是根据分组情况进行统计,最终进行全部汇总。

    (1)、简单的使用rollup--生成一行新数据。(要生成新的一行数据,还可以使用UNION ALL)

    1 SELECT D.DUMMY FROM DUAL D
    2 GROUP BY ROLLUP(D.DUMMY)

    结果:

             

    (2)先根据E.DEPTNO,E.JOB进行分组,根据从右向左的条件,

    1 SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB)
    2 ORDER BY E.DEPTNO

    结果:

    针对以上的使用ROLLUP的结果的理解:

    a:首先根据GROUP BY E.DEPTNO,E.JOB查询出9条数据(除4,8,12,13外),在根据rollup的定义:

    从右向左,对ROLLUP中的参数进行小计:

    首先根据JOB(对所有的JOB进行汇总),汇总出4,8,12行,在根据E.DEPTNO(对所有的DEPTNO进行汇总),汇总出

    第十三行数据。

    例如:GROUP BY ROLLUP(E.DEPTNO,E.JOB,E.ENAME)---

    首先:根据GROUP BY(E.DEPTNO,E.JOB,E.ENAME),查询,

    其次:E.ENAME--汇总,相同DEPTNO和相同的JOB

    再次:E.JOB--汇总,相同的部门

    最后:E.DEPTNO--汇总

    可以实际操作理解其意义。

    rollup(a,b)   统计列包含:(a,b)、(a)、()
    rollup(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a)、()

     (3)、特殊情况-----

    1 SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB)
    2 ORDER BY E.DEPTNO

    结果:

    理解:首先根据

    GROUP BY E.DEPTNO,E.JOB查询出前九条数据,

    其次:对E.DEPTNO进行汇总,但是必须考虑JOB,也就是

    相同的JOB,的所有的工资总和:

    所以出现下面五条数据。

     3、group by 配合cube的使用

    1 SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY CUBE(E.DEPTNO,E.JOB)
    2 ORDER BY E.DEPTNO

    理解:CUBE会对条件中的每一个条件进行单独的汇总:即对单独的列进行汇总

    GROUP BY CUBE(E.DEPTNO,E.JOB)

    首先根据:GROUP BY E.DEPTNO,E.JOB查询数据

    其次:对E.JOB进行汇总(不考虑DEPTNO,单独汇总,而ROLLUP是在同一个DEPTNO下面)

    再次::对E.DEPTNO进行汇总

    最后,全部汇总
     cube(a,b)     统计列包含:(a,b)、(a)、(b)、()

     cube(a,b,c)   统计列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()

    3、GROUPING 的使用

    GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。

    1 SELECT GROUPING(E.DEPTNO), E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB)
    2 ORDER BY E.DEPTNO

    结果:

    可以使用decode或者case函数进行转换这种不友好的显示:

     1 SELECT 
    2 CASE WHEN grouping(E.DEPTNO) = 1
    3 THEN '总计'
    4 ELSE E.DEPTNO || ''
    5 END AS 部门,
    6 CASE WHEN grouping(E.JOB) = 1 AND grouping(E.DEPTNO) = 0
    7 THEN '小计'
    8 ELSE E.JOB
    9 END AS 工作种类,
    10 SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB)
    11 ORDER BY E.DEPTNO

    结果:

     1 SELECT DECODE(GROUPING(E.DEPTNO), 1, '总计', E.DEPTNO) AS 部门,
    2 CASE
    3 WHEN GROUPING(E.JOB) = 1 AND GROUPING(E.DEPTNO) = 0 THEN
    4 '小计'
    5 ELSE
    6 E.JOB
    7 END AS 工作种类,
    8 SUM(E.SAL)
    9 FROM EMP E
    10 GROUP BY ROLLUP(E.DEPTNO, E.JOB)
    11 ORDER BY E.DEPTNO

    结果:

    grouping sets提供了指定汇总集合条件的功能。

    SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY GROUPING SETS(E.DEPTNO,E.JOB)

    结果:--根据E.DEPTNO,E.JOB分别汇总数据

    I believe that we are who we choose to be. Nobody‘s going to come and save you, you‘ve got to save yourself. 我相信我们成为怎样的人是我们自己的选择。没有人会来拯救你,你必须要自己拯救自己。
  • 相关阅读:
    libtorch初体验
    libtorch 常用api函数示例(史上最全、最详细)
    VS2015,vs2019用正则表达式搜索删除空白行的方法
    CMake引入opencv3.1.0编译时includes non-existent path问题解决
    opencv编译的时候的注意事项------如果出现 target glog::glog 找不到的情况,可能是由于glog的版本过低导致的。通常与ceres有关
    ID3D11Multithread 未声明的标识符 opencv 411 opencv400 3411 opencv440 vs2015 都出现这个错误 但是opencv311没有出现这个问题
    错误 LNK2001 无法解析的外部符号 "__declspec(dllimport) bool cv::__termination" (__imp_?__termination@cv@@3_NA) opencv_cudev
    raw.githubusercontent.com无法连接
    编译opencv3.1.0时出现错误:error: ‘NppiGraphcutState’ has not been declared
    Ubuntu16.04 安装g++6
  • 原文地址:https://www.cnblogs.com/caroline/p/2283353.html
Copyright © 2020-2023  润新知