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
相关推荐
GoGeekBaird3 小时前
69天探索操作系统-第66天:为现代操作系统设计高级实时进程间通信机制
后端·操作系统
还是鼠鼠4 小时前
单元测试-概述&入门
java·开发语言·后端·单元测试·log4j·maven
我最厉害。,。5 小时前
接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
后端·restful
AntBlack7 小时前
计算机视觉 : 端午无事 ,图像处理入门案例一文速通
后端·python·计算机视觉
福大大架构师每日一题9 小时前
2025-06-02:最小可整除数位乘积Ⅱ。用go语言,给定一个表示正整数的字符串 num 和一个整数 t。 定义:如果一个整数的每一位都不是 0,则称该整数为
后端
Code_Artist9 小时前
[Mybatis] 因 0 != null and 0 != '' 酿成的事故,害得我又过点啦!
java·后端·mybatis
程序员博博9 小时前
看到这种代码,我直接气到想打人
后端
南雨北斗9 小时前
php 图片压缩函数
后端
L2ncE9 小时前
ES101系列08 | 数据建模和索引重建
java·后端·elasticsearch
还是鼠鼠9 小时前
Maven---配置本地仓库
java·开发语言·后端·maven