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

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

1. group by

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

sql 复制代码
-- 公众号:小满小慢 小游戏: 地心侠士
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_C sum(F_A) group_id() grouping(F_C)
a 2 0 0
b 2 0 0

2. group by rollup

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

sql 复制代码
-- 公众号:小满小慢 小游戏: 地心侠士
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_C F_D SUM(F_A) GROUP_ID() GROUPING(F_C) GROUPING(F_D)
a L2 1 0 0 0
a NULL 2 0 0 1
a L1 1 0 0 0
b L2 1 0 0 0
b NULL 2 0 0 1
b L1 1 0 0 0
NULL NULL 4 0 1 1

3. group by cube

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

sql 复制代码
-- 公众号:小满小慢 小游戏: 地心侠士
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_C F_D SUM(F_A) GROUP_ID() GROUPING(F_C) GROUPING(F_D)
a L1 1 0 0 0
a L2 1 0 0 0
a 2 0 0 1
b L1 1 0 0 0
b L2 1 0 0 0
b 2 0 0 1
L1 2 0 1 0
L2 2 0 1 0
4 0 1 1

4. group by grouping sets

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

sql 复制代码
-- 公众号:小满小慢 小游戏: 地心侠士
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_C F_D SUM(F_A) GROUP_ID() GROUPING(F_C) GROUPING(F_D)
a L1 1 0 0 0
a L2 1 0 0 0
b L1 1 0 0 0
b L2 1 0 0 0
a 2 0 0 1
b 2 0 0 1
a 2 1 0 1
b 2 1 0 1

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分组项>::= <列名> | <值表达式>

sql 复制代码
--  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_B F_C F_D GROUPING(F_B) GROUPING(F_C) GROUPING(F_D) GROUPING_ID(F_B,F_C,F_D)
b a L1 0 0 0 0
b a L2 0 0 0 0
b a 0 0 1 1
b 0 1 1 3
1 1 1 7
相关推荐
超级小忍19 分钟前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
字节跳跃者21 分钟前
为什么Java已经不推荐使用Stack了?
javascript·后端
字节跳跃者21 分钟前
深入剖析HashMap:理解Hash、底层实现与扩容机制
javascript·后端
程序无bug23 分钟前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
程序无bug26 分钟前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队27 分钟前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
程序员NEO27 分钟前
精控Spring AI日志
人工智能·后端
考虑考虑44 分钟前
Maven 依赖范围(Scope)
java·后端·maven
张小洛1 小时前
Spring AOP 设计解密:代理对象生成、拦截器链调度与注解适配全流程源码解析
java·后端·spring·spring aop·aop
00后程序员1 小时前
iOS 性能测试工具全流程:主流工具实战对比与适用场景
后端