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

如何按星期几匹配同比销售数据?SQL上年收入查询异常求助

问题排查与修正方案

核心问题分析

你的SQL存在两个关键错误导致prev_year_revenue结果异常:

  • 字段名不匹配:原销售表的店铺字段是store,但你在SQL中错误使用了store_name,导致关联条件、分组和字段选择都无法正确匹配数据。
  • JOIN逻辑与过滤条件冲突:使用FULL OUTER JOIN后,WHERE条件过滤了c.date,使得JOIN逻辑退化为LEFT JOIN,且没必要保留FULL JOIN的冗余逻辑——我们只需要以当前年份的销售记录为主,关联上年对应星期的记录即可。

修正后的SQL代码

WITH cte AS (
    SELECT
        c.date,
        c.store,
        c.revenue AS current_revenue,
        COALESCE(p.revenue, 0) AS prev_revenue -- 无上年数据时显示0,可选
    FROM `_sales` c
    LEFT JOIN `_sales` p
        ON p.date = DATE_SUB(c.date, INTERVAL 52 WEEK) -- 关联上年同星期的日期
        AND c.store = p.store -- 修正字段名匹配
    WHERE 
        c.date BETWEEN DATE_SUB(CURRENT_DATE('Europe/Budapest'), INTERVAL 1 YEAR) -- 只取最近一年的当前数据,按需调整
        AND CURRENT_DATE('Europe/Budapest')
)
SELECT *
FROM cte
ORDER BY date, store;

修正说明

  1. 字段名修正:将所有store_name替换为原表的store字段,确保关联和字段选择正确。
  2. JOIN逻辑优化:改用LEFT JOIN以当前年记录为主,避免FULL JOIN带来的冗余数据。
  3. 关联条件直观化:用DATE_SUB(c.date, INTERVAL 52 WEEK)直接定位上年同星期的日期,和原条件c.date = DATE_ADD(p.date, INTERVAL 52 WEEK)等价,但更易理解。
  4. 时间范围调整:将原5年范围缩小为1年(按需调整),聚焦当年与上年的对比场景。
  5. 空值处理:用COALESCE将上年无数据的记录显示为0,避免结果出现NULL(可选)。

验证结果

执行修正后的SQL后,将得到你期望的输出:

datestorecurrent_revenueprev_revenue
2023-07-01US1000950
2023-07-03UK20001800

内容的提问来源于stack exchange,提问作者Firm Pomegranate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:32:39