考虑一个常见的业务场景:某零售商想要分析每月各个省份和全国下各品牌的销售情况。
例如,sales 表格如下:
从上述表格中,我们可以看到包装水品类各品牌包含的商品每月在各个省份各个渠道的销量和销售额信息。
现在我们分别使用SQL union all 和rollup两种方法来计算每月各个省份和全国下各品牌对应的销售额和销量。
方法一:union all
--方法一
--1.先分组聚合每月各个省份的品牌销量和销售额
select MONTH
,province_name
,brand_name
,sum(quantity) quantity
,sum(amount) amount
from sales
GROUP BY MONTH
,province_name
,brand_name
union all
-- 2.分组聚合每月全国的品牌销量和销售额
select MONTH
,'全国' as province_name
, brand_name
,sum(quantity) quantity
,sum(amount) amount
from sales
GROUP BY MONTH
,brand_name ;
在上述SQL中,我们使用sum函数分别分组聚合计算各省份品牌销量和销售额(注释1),又分组聚合计算了每月全国品牌的销量和销售额数据(注释2),然后用union all将两部分合并输出。
SQL运行后,数据如下:
方法二:rollup()
我们还可以使用rollup()函数同时计算出每月各省份和全国的品牌销量和销售额数据,SQL如下图所示,rollup()函数汇总出来全国数据province_name字段默认为空值,这里我们使用if语句判断一下,给定一个“全国”值。
--方法二
--1.rollup()同时每月各个省份和全国的品牌销量和销售额
select MONTH
,if(province_name is null,'全国',province_name) province_name --if语句判断一下全国
,brand_name
,sum(quantity) quantity
,sum(amount) amount
from sales
GROUP BY MONTH
,rollup(province_name)
,brand_name
;