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 的用法说明的主要内容,如果未能解决你的问题,请参考以下文章