如何按星期几匹配同比销售数据?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;
修正说明
- 字段名修正:将所有
store_name替换为原表的store字段,确保关联和字段选择正确。 - JOIN逻辑优化:改用
LEFT JOIN以当前年记录为主,避免FULL JOIN带来的冗余数据。 - 关联条件直观化:用
DATE_SUB(c.date, INTERVAL 52 WEEK)直接定位上年同星期的日期,和原条件c.date = DATE_ADD(p.date, INTERVAL 52 WEEK)等价,但更易理解。 - 时间范围调整:将原5年范围缩小为1年(按需调整),聚焦当年与上年的对比场景。
- 空值处理:用
COALESCE将上年无数据的记录显示为0,避免结果出现NULL(可选)。
验证结果
执行修正后的SQL后,将得到你期望的输出:
| date | store | current_revenue | prev_revenue |
|---|---|---|---|
| 2023-07-01 | US | 1000 | 950 |
| 2023-07-03 | UK | 2000 | 1800 |
内容的提问来源于stack exchange,提问作者Firm Pomegranate
相关产品推荐
相关产品推荐

