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 |