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

求助:实现前三个月记录总分统计的SQL查询异常问题

解决前三个月总分统计(含跨年场景)的SQL问题

嘿,我一眼就看出你原SQL的核心问题了——它没处理跨年的情况!当当前月份是1月时,你需要统计上一年10-12月的数据,但原SQL里YEAR(date) = YEAR(now())这个条件直接把上一年的记录过滤掉了,自然查不到正确结果。另外还有几个小问题也得修正,下面给你一步步拆解:

原SQL的问题点

  • 跨年场景失效:比如当前是2024年1月,MONTH(now()- INTERVAL 2 MONTH)是11月,但YEAR(date)=2024会排除2023年的10、11、12月数据;
  • 索引无法利用:用MONTH(date)和YEAR(date)这类函数包裹查询列,会导致数据库无法使用date列上的索引(如果存在的话),查询效率会打折扣;
  • GROUP BY语法问题:SELECT里包含name但GROUP BY只有empid,在严格SQL模式下会报错,因为非聚合列必须出现在GROUP BY中。

修正后的通用SQL

这个写法不管是否跨年,都能精准获取前三个月的所有记录:

SELECT empid, name, SUM(total) AS total
FROM formresult
WHERE date >= DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 3 MONTH)
  AND date < DATE_FORMAT(NOW(), '%Y-%m-01')
GROUP BY empid, name;

逻辑解释

咱们来拆解一下关键部分:

  • DATE_FORMAT(NOW(), '%Y-%m-01'):获取当前月份的第一天(比如2024-04-15会得到2024-04-01,2024-01-05会得到2024-01-01);
  • DATE_SUB(..., INTERVAL 3 MONTH):把当前月第一天往前推3个月,得到统计范围的起始日期(2024-04-01推3个月是2024-01-01,2024-01-01推3个月是2023-10-01);
  • date >= 起始日期 AND date < 当前月第一天:完美覆盖前三个月的所有日期,不会漏也不会多。

举个实际例子:

  • 当查看四月数据时,会筛选date在2024-01-01到2024-03-31之间的记录,汇总1-3月总分;
  • 当查看一月数据时,会筛选date在2023-10-01到2023-12-31之间的记录,汇总上一年后三个月总分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:41:41