求助:实现前三个月记录总分统计的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
相关产品推荐
相关产品推荐

