sql分组 group by rollup,cube,grouping sets,group_id,groupingId

sql分组 group by rollup,cube,grouping sets,group_id,groupingId

1. group by

根据某一列或者多列分组数据.

-- 公众号:小满小慢 小游戏: 地心侠士
with t as
 (select 1 as F_A, 'a' as F_C, 'L2' F_D
    from dual
  union all
  select 1 as F_A, 'a' as F_C, 'L1' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_C, 'L2' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_C, 'L1' F_D
    from dual)
select F_C, sum(F_A),group_id(),grouping(F_C) from t group by F_C

查询结果如下

F_Csum(F_A)group_id()grouping(F_C)
a200
b200

2. group by rollup

假如 ROLLUP 分组列为(A, B, C),首先对(A,B,C)进行分组,然后对(A,B)进行分组,接着对(A)进行分组,最后对全表进行查询,无分组列,其中查询项中出现在 ROLLUP 中的列设为 NULL。查询结果是把每种分组的结果集进行 UNION ALL 合并输出。如果分组列为 n 列,则共有 n+1 种组合方式。

-- 公众号:小满小慢 小游戏: 地心侠士
with t as
 (select 1 as F_A, 'a' as F_C, 'L2' F_D
    from dual
  union all
  select 1 as F_A, 'a' as F_C, 'L1' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_C, 'L2' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_C, 'L1' F_D
    from dual)
select F_C, F_D, sum(F_A), group_id(), grouping(F_C), grouping(F_D)
  from t
 group by rollup(F_C, F_D)
 order by F_C

查询结果如下

F_CF_DSUM(F_A)GROUP_ID()GROUPING(F_C)GROUPING(F_D)
aL21000
aNULL2001
aL11000
bL21000
bNULL2001
bL11000
NULLNULL4011

3. group by cube

假如,CUBE 分组列为(A, B, C),则首先对(A,B,C)进行分组,然后依次对(B,C)、(A,C)、©、(A,B)、(B)、(A)六种情况进行分组,最后对全表进行查询,无分组列,其中查询项存在于 CUBE 列表的列设置为 NULL。输出为每种分组的结果集进行 UNION ALL 输出最终结果

-- 公众号:小满小慢 小游戏: 地心侠士
with t as
 (select 1 as F_A, 'a' as F_C, 'L2' F_D
    from dual
  union all
  select 1 as F_A, 'a' as F_C, 'L1' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_C, 'L2' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_C, 'L1' F_D
    from dual)
select F_C, F_D, sum(F_A), group_id(), grouping(F_C), grouping(F_D)
  from t
 group by cube(F_C, F_D)
 order by F_C

查询结果如下

F_CF_DSUM(F_A)GROUP_ID()GROUPING(F_C)GROUPING(F_D)
aL11000
aL21000
a2001
bL11000
bL21000
b2001
L12010
L22010
4011

4. group by grouping sets

GROUPING SETS 是对 GROUP BY 的扩展,可以指定不同的列进行分组,每个分组列集作为一个分组单元。使用 GROUPING SETS,用户可以灵活的指定分组方式,避免 ROLLUP/CUBE 过多的分组情况,满足实际应用需求。GROUPING SETS 的分组过程为依次按照每一个分组单元进行分组,最后把每个分组结果进行 UNION ALL 输出最终结果

-- 公众号:小满小慢 小游戏: 地心侠士
with t as
 (select 1 as F_A, 'a' as F_C, 'L2' F_D
    from dual
  union all
  select 1 as F_A, 'a' as F_C, 'L1' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_C, 'L2' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_C, 'L1' F_D
    from dual)
select F_C, F_D, sum(F_A), group_id(), grouping(F_C), grouping(F_D)
  from t
 group by grouping sets(F_C, F_C,(F_C, F_D))

查询结果如下

F_CF_DSUM(F_A)GROUP_ID()GROUPING(F_C)GROUPING(F_D)
aL11000
aL21000
bL11000
bL21000
a2001
b2001
a2101
b2101

5. group_id

表示结果集来自于哪一个分组,用于区别相同分组的结果集。如果有 N 个相同分组,则 GROUP_ID 取值范围为 0~N-1。每组的初始值为 0

<GROUP_ID项>::=GROUP_ID()

6. grouping_id

表示参数列是否为分组列。返回值的每一个二进制位表示对应的参数列是否为分组列,如果是分组列,该位值为 0;否则为 1.然后把对应的二进制转换成十进制数

<GROUPING_ID项>::=GROUPING_ID (<grouping_id分组项>{,<grouping_id分组项>)
<grouping_id分组项>::= <列名> | <值表达式>

7. groupping

GROUPING 标识某子结果集是否是按指定分组项分组的结果,如果是,GROUPING 值为 0;否则为 1,就是在分组中的数据为0 否则为1

<GROUPING项>::=GROUPING (<grouping分组项>)
<grouping分组项>::= <列名> | <值表达式>

--  groupping  grouping_id 对应关系
-- 公众号:小满小慢 小游戏: 地心侠士
with t as
 (select 1 as F_A, 'b' as F_B, 'a' as F_C, 'L1' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_B, 'a' as F_C, 'L1' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_B, 'a' as F_C, 'L2' F_D
    from dual
  union all
  select 1 as F_A, 'b' as F_B, 'a' as F_C, 'L2' F_D
    from dual)
select F_B, F_C, F_D, grouping(F_B), grouping(F_C), grouping(F_D),
       grouping_id(F_B, F_C, F_D)
  from t
 group by rollup(F_B, F_C, F_D)

查询结果

F_BF_CF_DGROUPING(F_B)GROUPING(F_C)GROUPING(F_D)GROUPING_ID(F_B,F_C,F_D)
baL10000
baL20000
ba0011
b0113
1117
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值