如何编写SQL实现环比计算 为销售表新增上月销售额列
上月销售额匹配需求SQL实现方案
你当前编写的CASE语句存在逻辑错误:Date > DATE_SUB(Date, INTERVAL 1 MONTH) 对所有合法日期都成立,完全无法实现取上月销售额的效果。
以下是对应需求的正确实现方案,根据你的数据集情况选择即可:
方案1:适用于已完成月度聚合的数据集(每月仅存1条1号的记录)
直接使用窗口函数LAG实现,代码最简洁:
SELECT `Date`, `Total Sales` AS `Sales`, -- 按日期升序排序后取上一行的销售额,无匹配自动返回NULL LAG(`Total Sales`, 1) OVER (ORDER BY STR_TO_DATE(`Date`, '%m-%d-%Y')) AS `Previous Month Sales` FROM 你的表名
说明:先用STR_TO_DATE把字符串格式的月-日-年日期转为日期类型排序,避免字符串排序出现逻辑混乱。
方案2:适用于未聚合的日度明细数据集
需要先完成月度销售额聚合,再做匹配,兼容不支持窗口函数的SQL环境可以用自连接实现:
WITH monthly_agg AS ( -- 先做月度聚合,得到每个月的总销售额 SELECT DATE_FORMAT(STR_TO_DATE(`Date`, '%m-%d-%Y'), '%Y-%m-01') AS month_start, SUM(`Total Sales`) AS monthly_total FROM 你的表名 GROUP BY DATE_FORMAT(STR_TO_DATE(`Date`, '%m-%d-%Y'), '%Y-%m') ) SELECT DATE_FORMAT(a.month_start, '%m-%d-%Y') AS `Date`, a.monthly_total AS `Sales`, b.monthly_total AS `Previous Month Sales` FROM monthly_agg a -- 左连接匹配上月的销售额,匹配不到自动返回NULL LEFT JOIN monthly_agg b ON a.month_start = DATE_ADD(b.month_start, INTERVAL 1 MONTH) ORDER BY a.month_start
内容的提问来源于stack exchange,提问作者MrBiscuit
相关产品推荐
相关产品推荐

