SQL查询修正类单据报错:聚合函数不可出现在WHERE子句,求解决
解决SQL聚合函数在WHERE子句中的报错问题
错误原因
你遇到的报错是SQL语法规则限制导致的:聚合函数(如SUM)不能直接出现在WHERE子句中。WHERE子句用于筛选原始行数据,而聚合函数是对分组后的数据进行计算,两者执行顺序不同(WHERE先执行,分组和聚合后执行),因此无法在WHERE中直接使用聚合结果。
修正后的查询语句
根据你"找出修正数量总和大于关联单据数量的修正单据"的需求,需要调整查询逻辑,用GROUP BY分组计算总修正量,再通过HAVING子句过滤聚合后的结果:
场景1:每个修正单据对应单个关联单据位置
SELECT d.doc_Name FROM DOCUMENTS d JOIN DOCUMENT_POSITIONS dp ON dp.docPos_DocId = d.doc_Id -- 关联到对应的原始单据位置 JOIN DOCUMENT_POSITIONS related_dp ON related_dp.docPos_Id = dp.docPos_RelatedDocPosId WHERE d.doc_Type = 6 -- 仅筛选修正类型单据 GROUP BY d.doc_Id, d.doc_Name, related_dp.docPos_Qty HAVING SUM(dp.docPos_Qty) > related_dp.docPos_Qty;
场景2:每个修正单据对应多个关联单据位置(需计算关联位置总数量)
SELECT d.doc_Name FROM DOCUMENTS d JOIN DOCUMENT_POSITIONS dp ON dp.docPos_DocId = d.doc_Id LEFT JOIN DOCUMENT_POSITIONS related_dp ON related_dp.docPos_Id = dp.docPos_RelatedDocPosId WHERE d.doc_Type = 6 GROUP BY d.doc_Id, d.doc_Name -- COALESCE处理关联单据为空的情况,避免NULL导致计算异常 HAVING SUM(dp.docPos_Qty) > COALESCE(SUM(related_dp.docPos_Qty), 0);
关键调整说明
- 将原WHERE中的
SUM(docPos_Qty)移至HAVING子句:HAVING专门用于过滤分组后的聚合结果,符合SQL执行逻辑。 - 添加
GROUP BY子句:按照单据ID、名称(以及关联单据数量,场景1)分组,确保聚合函数能正确计算每个单据的总修正量。 - 显式关联关联单据位置:原查询的子查询写法易引发逻辑歧义,改为JOIN方式更清晰,也便于分组计算。
内容的提问来源于stack exchange,提问作者maniootek
相关产品推荐
相关产品推荐

