BigQuery中基于选定日期范围实现总销售额重复显示的SQL需求
解决BigQuery中SUM_GROSS列显示日期范围总销售额的问题
嘿,我来帮你搞定这个BigQuery的需求!你之前用PARTITION BY SALE_DATE的窗口函数只能得到单天的总和重复显示,现在要让SUM_GROSS列展示整个选定日期范围内的总销售额,其实只需要调整窗口函数的范围就可以了。
核心思路
你之前的窗口函数按日期分区,相当于把数据拆成了每天的独立分组,所以计算的是单天总和。现在我们要让窗口覆盖整个查询结果集,去掉PARTITION BY子句,这样窗口函数就会计算所有符合条件的数据的总销售额,并且在每一行重复显示这个值。
具体SQL写法
情况1:未按日期分组,显示每条销售记录的GROSS和范围总销售额
如果你的查询是展示每条单独的销售记录,同时在SUM_GROSS列显示整个日期范围的总销售额,可以用下面的SQL:
SELECT SALE.SALE_DATE, SALES.GrossValueBaseCurrency AS GROSS, -- 去掉PARTITION BY,窗口覆盖整个结果集 SUM(SALES.GrossValueBaseCurrency) OVER() AS SUM_GROSS FROM `your-project.your-dataset.sales_header` AS SALE -- 替换成你的实际表名 JOIN `your-project.your-dataset.sales_details` AS SALES -- 替换成你的实际关联表 ON SALE.sale_id = SALES.sale_id -- 这里添加日期筛选条件,根据你的需求调整 WHERE SALE.SALE_DATE BETWEEN '2018-01-01' AND '2018-01-06'
比如你说的6条数据每条GROSS是10,这个查询的SUM_GROSS列每一行都会显示60,完全符合你的预期。
情况2:按日期分组后,显示每天销售额和范围总销售额
如果需要先按日期分组计算每天的销售额,再让SUM_GROSS显示整个范围的总销售额,可以用CTE(公共表表达式)来实现:
WITH daily_total AS ( -- 先计算每天的销售额总和 SELECT SALE.SALE_DATE, SUM(SALES.GrossValueBaseCurrency) AS GROSS FROM `your-project.your-dataset.sales_header` AS SALE JOIN `your-project.your-dataset.sales_details` AS SALES ON SALE.sale_id = SALES.sale_id WHERE SALE.SALE_DATE BETWEEN '2018-01-01' AND '2018-04-01' GROUP BY SALE.SALE_DATE ) -- 再计算整个日期范围的总销售额并重复显示 SELECT SALE_DATE, GROSS, SUM(GROSS) OVER() AS SUM_GROSS FROM daily_total
比如筛选2018-01-01至2018-04-01后,每天的GROSS总和是30,那么SUM_GROSS列每一行都会显示30,和你期望的效果一致。
小提示
如果你的查询还有其他筛选条件(比如特定区域、特定产品),只要把这些条件加到WHERE子句里,窗口函数依然会基于所有符合条件的数据计算总销售额,完全适配你的筛选需求。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

