zoukankan      html  css  js  c++  java
  • SQL 中ROLLUP 用法

    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

    部门         员工         工资

    A             ZHANG     100 
    A             LI             200 
    A             WANG      300 
    A             ZHAO      400 
    A             DUAN      500 
    B             DUAN      600 
    B             DUAN      700

     

    (1)GROUP BY 

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

    结果:

    A             DUAN      500 
    B             DUAN      1300 
    A             LI        200 
    A             WANG      300 
    A             ZHANG     100 
    A             ZHAO      400

    (2)ROLLUP

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

    结果如下:

    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

    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

    结果:

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

    (3)CUBE

    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 员工

    结果:

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

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

    ROLLUP ( )

    生成简单的 GROUP BY 聚合行以及小计行或超聚合行,还生成一个总计行。
     
    SELECT a, b, c, SUM ( <expression> )
      FROM T
      GROUP BY ROLLUP (a,b,c);
       
     
    会为 (a, b, c)、 (a, b) 和 (a) 值的每个唯一组合生成一个带有小计的行。 
    还将计算一个总计行。
     
     
    列是按照从右到左的顺序汇总的。
    列的顺序会影响 ROLLUP 的输出分组,而且可能会影响结果集内的行数。
     
    CUBE ( )
     
    生成简单的 GROUP BY 聚合行、ROLLUP 超聚合行和交叉表格行。
       
    SELECT a, b, c, SUM (<expression>)
    FROM T
    GROUP BY CUBE (a,b,c);
     
     
    会为 (a, b, c)、 (a, b)、 (a, c)、 (b, c)、 (a)、 (b) 和 (c) 值的每个唯一组合生成一个带有小计的行,还会生成一个总计行。 
     
    列的顺序不影响 CUBE 的输出。
  • 相关阅读:
    绳关节(b2RopeJoint)
    公式推导 圆面积公式 圆周长公式
    ALTER TABLE causes auto_increment resulting key 'PRIMARY'
    MySQL通过Binlog恢复删除的表
    Barracuda VS antelope
    mysqldump 参数说明
    MySQL复制
    MySQL Server-id的作用
    MySQL 简洁连接数据库方式
    Kill 所有MySQL进程
  • 原文地址:https://www.cnblogs.com/huangf714/p/6133877.html
Copyright © 2011-2022 走看看