You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:54:02