• 【SQL】Rollup、Group By、CUBE聚合函数


    ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集。

    下面是 CUBE 和 ROLLUP 之间的具体区别:

    • CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
    • ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。

      ROLLUP 优点:

      • (1)ROLLUP 返回单个结果集,而 COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。
      • (2)ROLLUP 可以在服务器游标中使用,而 COMPUTE BY 则不可以。
      • (3)有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。

    下面对比一下GROUP BY 、CUBE 和  ROLLUP后的结果

    创建表:

    CREATE TABLE DEPART
    (部门 char(10),员工 char(6),工资 int);

    INSERT INTO DEPART SELECT 'A','ZHANG',100;
    INSERT INTO DEPART SELECT 'A','LI',200;
    INSERT INTO DEPART SELECT 'A','WANG',300;
    INSERT INTO DEPART SELECT 'A','ZHAO',400;
    INSERT INTO DEPART SELECT 'A','DUAN',500;
    INSERT INTO DEPART SELECT 'B','DUAN',600;
    INSERT INTO DEPART SELECT 'B','DUAN',700;

    (1)GROUP BY 

    SELECT 部门,员工,SUM(工资)AS TOTAL
    FROM DEPART
    GROUP BY 部门,员工

    结果:

    (2)ROLLUP

    SELECT 部门,员工,SUM(工资)AS TOTAL
    FROM DEPART
    GROUP BY  部门,员工  WITH ROLLUP

    结果如下:

    ROLLUP结果集中多了三条汇总信息:即部门A的合计,部门B的合计以及总合计。其中将部门B中的DUAN合计。

    等价于下列SQL语句

    SELECT 部门,员工,SUM(工资)AS TOTAL
    FROM DEPART
    GROUP BY 部门,员工
    union
    SELECT 部门,'NULL',SUM(工资)AS TOTAL
    FROM DEPART
    GROUP BY  部门
    union
    SELECT 'NULL','NULL',SUM(工资)AS TOTAL
    FROM DEPART

    结果:

    (3)CUBE 【SQL server】【Oracle】

    SELECT 部门,员工,SUM(工资)AS TOTAL
    FROM DEPART
    GROUP BY 部门,员工 WITH CUBE

    结果:

    A             DUAN      500
    A             LI           200
    A             WANG      300
    A             ZHANG     100
    A             ZHAO      400
    A             NULL      1500
    B             DUAN      1300
    B             NULL      1300
    NULL    NULL         2800
    NULL    DUAN        1800
    NULL    LI               200
    NULL    WANG       300
    NULL    ZHANG       100
    NULL    ZHAO         400

    CUBE的结果集是在 ROLLUP结果集的基础上多了5行,这5行相当于在ROLLUP结果集上在union 上以员工 (即CUBE)为 GROUP BY的结果。

    SELECT 部门,员工,SUM(工资)AS TOTAL
    FROM DEPART
    GROUP BY 部门,员工 WITH CUBE

    等价于下列的SQL语句:

    SELECT 部门,员工,SUM(工资)AS TOTAL
    FROM DEPART
    GROUP BY  部门,员工  WITH ROLLUP

    union

    SELECT 'NULL',员工,SUM(工资)AS TOTAL
    FROM DEPART
    GROUP BY 员工

    结果:

    不用讲了吧,一对比结果就全明白了。

  • 相关阅读:
    MyEclipse Tern was unable to complete your request in time
    12.5.2 访问被覆盖的方法
    猎头、培训与咨询的价值(2)【补1】——北漂18年(93)
    12.5.1 通过 @ISA 继承
    从柯洁对战AlphaGo,看商业智能
    jquery ajax POST 例子详解
    利用组合索引优化
    Oracle range 分区表
    Perl 面向对象上
    JSON导出CSV中文乱码解决方案
  • 原文地址:https://www.cnblogs.com/phospherus/p/14144749.html
Copyright © 2020-2023  润新知