SQL查询无结果排查:为何无法获取产品上月销售额?
条件
a.mth = (select prev_mth from date_test b where b.mth = a.mth)失效原因分析 核心逻辑错误
这个条件的逻辑完全颠倒,导致无任何数据能满足匹配要求:
- 对于
sales表中的每一行记录a,子查询select prev_mth from date_test b where b.mth = a.mth会返回当前行月份对应的上月日期(比如a.mth是2024-10-31时,返回2024-09-30) - 随后条件判断
a.mth = [返回的上月日期],相当于要求当前月份等于它的上月月份,这在时间逻辑上不可能成立,因此没有任何行能通过筛选,最终sales_prev_mth返回空结果。
结合测试数据验证
结合你的测试数据来看:
sales表只有2024-10-31和2024-09-30两个月份的数据- 当
a.mth = '2024-10-31'时,子查询返回'2024-09-30',判断'2024-10-31' = '2024-09-30'不成立 - 当
a.mth = '2024-09-30'时,子查询返回'2024-08-31',判断'2024-09-30' = '2024-08-31'也不成立
所有行都无法满足条件,自然没有结果输出。
正确逻辑方向
如果要获取每个月份的上月销售额,应该先通过date_test找到每个月份对应的上月日期,再将sales_sum与自身关联(或关联date_test后再关联sales_sum),匹配上月日期的销售额数据。例如修改后的CTE可以是:
sales_prev_mth as ( select s.mth, s.product, s.sum_price as mth_sum, coalesce(sp.sum_price, 0) as prev_mth_sum from sales_sum s left join date_test dt on s.mth = dt.mth left join sales_sum sp on dt.prev_mth = sp.mth and s.product = sp.product )
内容的提问来源于stack exchange,提问作者John Lo
相关产品推荐
相关产品推荐

