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
相关推荐
JaguarJack2 分钟前
PHP 8.2 vs PHP 8.3 对比:新功能、性能提升和迁移技巧
后端·php
学历真的很重要9 分钟前
Claude Code 万字斜杠命令指南
后端·语言模型·面试·职场和发展·golang·ai编程
稻草猫.1 小时前
Java线程安全:volatile与wait/notify详解
java·后端·idea
IT_陈寒1 小时前
Vite 5年迭代揭秘:3个核心优化让你的项目构建速度提升200%
前端·人工智能·后端
拾贰_C1 小时前
【SpringBoot】前后端联动实现条件查询操作
java·spring boot·后端
catchadmin3 小时前
PHP 快速集成 ChatGPT 用 AI 让你的应用更聪明
人工智能·后端·chatgpt·php
callJJ7 小时前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
你的人类朋友9 小时前
JWT的组成
后端
北风朝向10 小时前
Spring Boot参数校验8大坑与生产级避坑指南
java·spring boot·后端·spring
canonical_entropy11 小时前
一份关于“可逆计算”的认知解码:从技术细节到哲学思辨的完整指南
后端·低代码·deepseek