GROUPING函数是为了得到汇总单位不同的汇总结果
GROUPING函数包含以下三种:ROLLUP、CUBE、GROUPING SETS
ROLLUP使用方法
--使用ROLLUP同时得出合计和小计
select product_type, sum(sale_price) as sum_price
from product
group by rollup(product_type)
/*最后一行也可以改为
group by product_type with rollup*/
执行结果
product_type | sum_price |
---|---|
16780 | |
a | 11180 |
b | 600 |
c | 5000 |
--在Group BY中添加'regist_date'字段
select product_type,regist_date,sum(sale_price) as sum_price
from product
group by rollup(product_type,regist_date)
执行结果
product_type | regist_date | sum_price | |
---|---|---|---|
16780 | <-合计 | ||
a | 11180 | <-小计(厨房用品) | |
a | 2022-09-01 | 880 | |
a | 2022-09-02 | 6800 | |
a | 2022-09-03 | 3500 | |
b | 600 | <-小计(办公用品) | |
b | 2022-09-04 | 500 | |
b | 2022-09-05 | 100 | |
c | (GROUPING:1) | 5000 | <-小计(衣服) |
c | 2022-09-03 | 1000 | |
c | (GROUPING:0) | 4000 |
相当于使用UNION对GROUP BY(),GROUP BY(product_type),GROUP BY(product_type,regist_date)三种模式的聚合级的不同结果进行连接。
GROUPING函数
c的最后一行regist_date为空,是因为GROUP BY将NULL作为了聚合键,将c中所有regist_date为NULL的聚合为一组。
故可以采用GROUPING函数,该函数能分辨超级分组记录中的NULL和原始数据本身的NULL,在其参数列的值为超级分组记录所产生的NULL时返回1,其他情况返回0(见上表)。
CUBE使用方法
select product_type,regist_date,sum(sale_price) as sum_price
from product
group by cube(product_type,regist_date)
与ROLLUP相比,CUBE的结果多出的几行结果就是只把Regist_date作为聚合键所得到的汇总结果。共包含GROUP BY(),GROUP BY(product_type),GROUP BY(product_type,regist_date),GROUP BY(regist_date)四个维度。
GROUPING SETS使用方法
select product_type,regist_date,sum(sale_price) as sum_price
from product
group by grouping sets(product_type,regist_date)
简单概括就是GROUPING SETS(product_type,regist_date)只有GROUP BY(product_type),GROUP BY(regist_date)两个维度。