DB2 RollupCubegrouping 的用法说明

Posted faraway2004

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DB2 RollupCubegrouping 的用法说明相关的知识,希望对你有一定的参考价值。

本文简单讲述db2之rollup、cube、grouping的使用,db2数据库在使用常规的group进行分组查询时,通常会结合使用rollup、cube、grouping一起使用。

概述

Rollup、Cube,这两个函数是对查询结果集加上多维的数据信息。说的直白点,就是给查询的SQL集,加上不同的小计、合计。grouping则用来标识是否使用分组字段,用来区分不同维度的统计数据信息。

    Rollup、Cube、grouping,这三个函数是和group by一起使用。具体写法为:select   grouping( column_name)   group by  column_name  with rollup   或select   grouping( column_name)   group by  column_name  with cube。

上面grouping( column_name)的取值为0或1,当未使用rollup或cube时,即使用常规的group by时,取值为0;当使用rollup或cube进行多维查询时,若column_name未参与分组,即查询其小计信息时,其值为1,可根据此值来区分正常的分组统计信息和小计、合计统计信息。

   CUBE ROLLUP之间的具体区别:

·        CUBE生成的结果集显示了所选列中值的所有组合的聚合。

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

ROLLUP优点:

    (1)ROLLUP返回单个结果集,而 COMPUTEBY返回多个结果集,而多个结果集会增加应用程序代码的复杂性。

   (2)ROLLUP可以在服务器游标中使用,而 COMPUTEBY则不可以。

  (3)有时,查询优化器为 ROLLUP生成的执行计划比为 COMPUTEBY生成的更为高效。

测试

    下面将举例说明:

建表

    测试表为:

CREATE TABLE "REPORT"."TB_EMP"
 ("EMP_ID"      SMALLINT        NOT NULL,
  "EMP_NAME"    VARCHAR(40),
  "EMP_SEX"     SMALLINT,
  "EMP_CITY"    VARCHAR(200),
  "EMP_NATION"  VARCHAR(200),
  "EMP_SAL"     VARCHAR(20),
  "HIRE_DATE"   TIMESTAMP,
  "DEPT_ID"     SMALLINT
 )


ALTER TABLE "REPORT"."TB_EMP"
  LOCKSIZE ROW
  APPEND OFF
  NOT VOLATILE
  LOG INDEX BUILD NULL;

ALTER TABLE "REPORT"."TB_EMP"
  ADD CONSTRAINT "P_K_EMP" PRIMARY KEY
   ("EMP_ID"
   );

测试数据

insert into "REPORT"."TB_EMP" values(1,'张三',1,'北京','中国','10000',null,10);
insert into "REPORT"."TB_EMP" values(2,'李四',2,'北京','中国','10000','2014-9-1',10);
insert into "REPORT"."TB_EMP" values(9,'王五',1,'上海','中国','10000','2014-9-1',20);
insert into "REPORT"."TB_EMP" values(3,'赵六',1,'上海','中国','10000','2014-9-1',30);
insert into "REPORT"."TB_EMP" values(4,'李飞',1,'北京','中国','10000','2014-9-1',20);
insert into "REPORT"."TB_EMP" values(5,'刘洋',2,'北京','中国','10000','2014-9-1',30);
insert into "REPORT"."TB_EMP" values(6,'张丽',2,'上海','中国','10000','2014-9-1',10);
insert into "REPORT"."TB_EMP" values(7,'李红',2,'上海','中国','10000','2014-9-1',30);
insert into "REPORT"."TB_EMP" values(8,'宋菲',2,'北京','中国','10000','2014-9-1',20);

测试grouping

使用常规的group by时,grouping取值为0

测试结果如下:

单字段分组查询


两个字段分组查询


单字段分组查询

    1)、一个字段分组,即group by 后只跟一个字段

   rollup用法:

select grouping(DEPT_ID), "DEPT_ID", avg("EMP_SAL") from "REPORT"."TB_EMP" group by DEPT_ID with rollup;


   等价于:

select grouping(DEPT_ID), "DEPT_ID", avg("EMP_SAL") from "REPORT"."TB_EMP" group by DEPT_ID union all select 1, null, avg("EMP_SAL") from "REPORT"."TB_EMP";
运行结果


   cube 用法:

select grouping(DEPT_ID), "DEPT_ID", avg("EMP_SAL") from "REPORT"."TB_EMP" group by DEPT_ID with cube;

   等价于:;

select grouping(DEPT_ID), "DEPT_ID", avg("EMP_SAL") from "REPORT"."TB_EMP" group by DEPT_ID union all select 1, null, avg("EMP_SAL") from "REPORT"."TB_EMP";

运行结果


两个字段分组查询

  2)、两个字段分组,group by 后跟2个字段

   rollup 用法:

select grouping(DEPT_ID),grouping(EMP_SEX), "DEPT_ID","EMP_SEX", avg("EMP_SAL") from "REPORT"."TB_EMP" group by DEPT_ID,EMP_SEX with rollup;

   等价于

select grouping(DEPT_ID),grouping(EMP_SEX), "DEPT_ID","EMP_SEX", avg("EMP_SAL") from "REPORT"."TB_EMP" group by DEPT_ID,EMP_SEX 
union all select grouping(DEPT_ID),1, "DEPT_ID",null, avg("EMP_SAL") from "REPORT"."TB_EMP" group by DEPT_ID
union all select 1,1, null,null, avg("EMP_SAL") from "REPORT"."TB_EMP";

   运行结果


cube 用法:

select grouping(DEPT_ID),grouping(EMP_SEX), "DEPT_ID","EMP_SEX", avg("EMP_SAL") from "REPORT"."TB_EMP" group by DEPT_ID,EMP_SEX with cube;

等价于

select grouping(DEPT_ID),grouping(EMP_SEX), "DEPT_ID","EMP_SEX", avg("EMP_SAL") from "REPORT"."TB_EMP" group by DEPT_ID,EMP_SEX with rollup
union all select 1,grouping(EMP_SEX), null,"EMP_SEX", avg("EMP_SAL") from "REPORT"."TB_EMP" group by EMP_SEX;
运行结果:


多字段分组查询

3)多字段不再赘述

以上是关于DB2 RollupCubegrouping 的用法说明的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中group by 的扩展函数rollupcubegrouping sets

怎样确定DB2 JDBC驱动的版本

substring和substr有啥区别

merge和update的区别

decimal 在JAVA里怎么表示?

db2常用命令