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

SQL同比(YOY)计算问题:获取去年同期15天数据无结果求解决

问题排查及修复方案

错误点说明

  • 匹配范围逻辑错误:现有语句的DAYOFYEAR判断仅匹配去年「当前日期往前15天」这单日的年积日,没有覆盖完整的15天区间,符合条件的数据量极少甚至为空,是无结果输出的核心原因。
  • 函数参数冗余错误:绝大多数SQL方言(如MySQL、PostgreSQL等)的DAYOFYEAR函数仅接收1个日期参数,你额外传入的第二个参数0会触发隐式转换,导致日期计算结果不符合预期,部分数据库不会抛出语法错误但逻辑完全失效。
  • 聚合逻辑错误:CASE WHEN的返回值使用了字符串'Rev',SUM对字符串做聚合时会默认转为数值0,哪怕有符合条件的匹配数据,最终统计结果也会为0,需要替换为你实际要统计的业务字段(如营收字段revenue)。

正确写法示例

写法1:直接按日期区间匹配(兼容性最好)

SUM(CASE
  -- 匹配去年同期的15天区间:去年的今天往前数15天(含首尾)
  WHEN `date_entered` >= DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 YEAR), INTERVAL 14 DAY) 
  AND `date_entered` <= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
  THEN revenue -- 此处替换为你实际要统计的业务字段名
  ELSE 0
END) AS last_year_15d_sum

写法2:按年积日匹配(兼容跨年、闰年场景)

如果需要避免跨年或闰年导致的日期偏移问题,可以用年积日区间判断:

SUM(CASE
  WHEN DAYOFYEAR(`date_entered`) BETWEEN DAYOFYEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR + 14 DAY))
  AND DAYOFYEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))
  THEN revenue
  ELSE 0
END) AS last_year_15d_sum

内容的提问来源于stack exchange,提问作者Ryan Van Wagenen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:12:02