group by的rollup、cube、grouping、grouping sets 的用法浅析

group by的rollup、cube、grouping、grouping sets 的用法浅析


sql中group by后带cube子句的功能是对GROUP BY后面的字段所有的组合进行分组求和。


首先有这样一张表t_zby_bgyp,作为演示的基础表:


建表语句:

-- Create table
create table T_ZBY_BGYP
(
  id     NUMBER(16) not null,
  bgypbh VARCHAR2(30),   -- 办公用品编号
  bgypmc VARCHAR2(30),   -- 名称
  wplx   NUMBER(12),    -- 物品类型
  zsl    NUMBER(10),   --总数量
  zksl   NUMBER(10),   -- 在库数量
  syjl   VARCHAR2(200),  -- 使用记录
  wpzt   NUMBER(12)   -- 物品状态
)
tablespace TMYH_DATA
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints 
alter table T_ZBY_BGYP
  add constraint PK_T_ZBY_BGYP primary key (ID)
  using index 
  tablespace TMYH_DATA
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );


插入字段语句:

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (1, '10000001', '笔记本', 2, 13, 13, '啊实打实大', 1);

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (3, '10000003', 'U盘', 2, 45, 45, '收电费多少份', 1);

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (4, '10000002', '创可贴', 1, 22, 20, null, 1);

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (10, '20170807', 'tttt', 2, 12, 12, null, 1);

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (11, '20170809', 'tttt', 2, 12, 12, null, 1);

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (6, '20170806', '123', 1, 29, 29, null, 1);

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (5, '20170806', '123', 1, 20, 20, null, 1);

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (7, '20170806', 'test001', 3, 36, 36, null, 1);

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (8, '20170806', 'test002', 3, 39, 39, null, 1);

insert into T_ZBY_BGYP (ID, BGYPBH, BGYPMC, WPLX, ZSL, ZKSL, SYJL, WPZT)
values (9, '20170807', '11111111111111111', 1, 0, 0, null, 1);

如图:

group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析

grouping的用法:

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

select grouping(WPLX),WPLX,count(zsl) from t_zby_bgyp group by rollup (WPLX)

group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析

rollup的用法:

--ROLLUP会根据GROUP BY后面的字段从右到左逐步以去掉右边一个字段,逐步向上累计求和。

select grouping(WPLX),WPLX,BGYPBH,count(ZSL) from t_zby_bgyp group by rollup (WPLX,BGYPBH)

group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析

cube的用法:

--group by cube会对GROUP BY后面的字段所有的组合进行分组求和。
select grouping(WPLX),WPLX,BGYPBH,count(ZSL) from t_zby_bgyp group by cube (WPLX,BGYPBH)

group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析

grouping sets的用法:

--使用GROUPING SETS子句可以只返回小计记录,根据返回字段从右向左统计
select WPLX,BGYPBH,count(ZSL) from t_zby_bgyp group by grouping sets (WPLX,BGYPBH)

group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析group by的rollup、cube、grouping、grouping sets 的用法浅析


小弟整理,希望对各位兄弟有帮助。