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

SQL查询BETWEEN条件未正确生效,char类型mois字段筛选异常求助

分析你的SQL查询问题

嘿,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:45:07