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
相关产品推荐
相关产品推荐

