【SQL】GROUPING SETS 与GROUPING__ID组合使用详解

808 阅读1分钟

grouping set 定义了group by 的时候的组合关系,例如 【SQL1】

select area,age,sum(price) as price 
from tableA 
group by area,age, product,category 
grouping sets((area, age, product), (area, age, categroy))

运用grouping sets 以后相当于做了如下的操作 【SQL2】

select area,age,product as dim,sum(price) as price 
from tableA 
group by area,age, product

union all

select area,age,categroy as dim,sum(price) as price 
from tableA 
group by area,age, categroy

使用grouping sets 方法后,可以联合使用GROUPING__ID 获取 sets中的id 此处的grouping_id的获取方法不是按照传统的顺序标记id的方式,而是用0、1按照group by的顺序对照grouping sets是否做了group来判断0|1, 然后用二进制方式计算获取到id值。

以【SQL1】为例

group by area,age,product,category 一共有四个group字段,则grouping sets的组合取值范围为【0001 - 1110】

第一个set (area, age, product) = 0001 == 1

0(area被group)0(age被group)0(product被group)1 (category没有被group)

(area, age, categroy) = 0010 == 2

0(area被group)0(age被group)1(product没有group)0 (category被group)

此时我们在【SQL1】中加入grouping_id就可以获取到sets中的id,方便对sets做一些处理

select case grouping_id when 1 then product
                        when 2 then category 
                        end as dim, 
                        area,
                        age,
                        sum(price) as price 
from tableA 
group by area,age, product,category 
grouping sets((area, age, product), (area, age, categroy))