SQL查询使用HAVING MAX<>SUM条件过滤失效问题排查
问题根因
HAVING子句过滤失效的核心原因是浮点数精度误差:
- 你表中
ExpenditureComplete字段为Float类型,Float属于近似数值类型,存储、运算过程中都会产生微小的精度偏差。肉眼看起来完全相等的两个数值,底层存储的二进制值可能存在可被运算识别的微小差异,直接用<>判断就会出现不符合预期的结果。
修复方案
- 从根源解决:如果业务允许修改表结构,把
ExpenditureComplete字段从Float替换为精确数值类型,例如SQL Server/MySQL中的DECIMAL类型,按需指定精度和小数位,彻底避免浮点数精度问题。 - 临时兼容处理:如果暂时无法修改表结构,调整HAVING子句的判断逻辑,改为校验两个值的差值绝对值是否小于业务可接受的最小误差阈值,示例如下:
-- 示例默认业务可接受的最小精度为0.001,可根据实际场景调整阈值 HAVING ABS(MAX(a.ExpenditureComplete) - SUM(b.DurationHour)) > 0.001
额外优化提示
你的查询逻辑中已经配置了a.ID = b.MainTable_ID的关联条件,GROUP BY子句中同时写a.ID和b.MainTable_ID属于冗余配置,保留任意一个即可正常运行,可简化代码。
内容的提问来源于stack exchange,提问作者Mick
相关产品推荐
相关产品推荐

