SQL查询BETWEEN条件未正确生效,char类型mois字段筛选异常求助
嘿,Lucille,我来帮你拆解下这个问题的核心原因~
核心问题:GROUP BY子句不符合SQL规范
你当前的查询里,GROUP BY idVisiteur,但SELECT语句里还包含了mois、nbJustificatifs、idEtat这些非聚合字段,这违反了SQL的ONLY_FULL_GROUP_BY标准(很多数据库默认开启,部分宽松模式下可能允许,但结果完全不可控)。
当数据库遇到这种情况时,会从每个idVisiteur分组中随机选取一条记录的mois、nbJustificatifs、idEtat值返回——刚好你看到的所有分组都返回了mois=201009的记录(大概率是每个访客分组里最早的一条数据),这就造成了“仅返回201009结果”的假象,实际上其他月份的数据并没有被正确统计展示。
次要细节:char(6)类型的条件写法
虽然你试过加单引号和改>=<=写法没变化,但mois是char(6)类型,建议用字符串格式的条件更规范,避免隐式转换可能带来的意外:
WHERE mois BETWEEN '201009' AND '201804'
不过这个不是导致你当前问题的核心原因,因为201009到201804作为字符串的排序逻辑和数值是一致的。
正确的查询写法(按业务需求调整)
如果你想按每个访客、每个月份统计报销金额,需要把mois也加入GROUP BY,同时确保非聚合字段要么在GROUP BY里,要么用聚合函数处理(比如nbJustificatifs如果是当月单据数,应该是分组唯一的,可以加入GROUP BY):
SELECT mois, idVisiteur, nbJustificatifs, SUM(montantValide) AS total_montant_valide, idEtat FROM fichefrais WHERE mois BETWEEN '201009' AND '201804' GROUP BY idVisiteur, mois, nbJustificatifs, idEtat;
如果nbJustificatifs或idEtat在同一个(idVisiteur, mois)分组里可能有多个值,你需要用聚合函数(比如MAX(nbJustificatifs)、MIN(idEtat))来明确你要取什么值。
快速验证方法
你可以先去掉GROUP BY,执行基础查询看看数据范围是否正确:
SELECT DISTINCT mois FROM fichefrais WHERE mois BETWEEN '201009' AND '201804';
如果能返回多个月份,就说明WHERE条件是有效的,问题确实出在GROUP BY的逻辑上。
内容的提问来源于stack exchange,提问作者Lucille

