SQL错误[1111][HY000]:聚合函数使用无效,求利润查询语句问题排查
问题分析与解决
你的查询报错的核心原因有两个:
- 聚合函数嵌套使用不当:你在外层
SUM()里直接嵌套了内层的sum(t3.amount),这种聚合函数嵌套在常规SQL语法中不被允许,数据库无法直接解析多层聚合逻辑。 - 聚合字段与非聚合字段混用:CASE语句里的
t2.amount是非聚合字段,但你的GROUP BY仅指定了t1.lot_name,数据库无法确定每个分组中该使用哪个t2.amount值,违反了聚合查询的规则。
修正后的查询语句
先通过子查询算出每个批次(lot_name)对应的销售总金额,再关联采购相关表计算利润:
SELECT ROUND(SUM(CASE WHEN t4.total_sales_amount <= t2.amount THEN 0 ELSE t4.total_sales_amount - t2.amount END), 2) AS `Profit` FROM `tabPurchase Order` AS t1 JOIN `tabPurchase Order Item` AS t2 ON t1.name = t2.parent JOIN ( -- 子查询计算每个批次的销售总金额 SELECT lot_no, SUM(amount) AS total_sales_amount FROM `tabSales Order Item` WHERE docstatus = 1 GROUP BY lot_no ) AS t4 ON t1.lot_name = t4.lot_no WHERE t1.docstatus = 1 GROUP BY t1.lot_name
说明
- 子查询
t4先按批次号(lot_no)聚合,算出每个批次的总销售金额,避免了内层聚合和外层聚合的嵌套冲突。 - 关联采购订单项后,针对每个采购项的金额
t2.amount,和对应批次的总销售金额比较,计算单条采购项的利润,最后通过外层SUM()汇总每个批次的总利润。 - 把
ROUND()放到外层,确保最终结果只做一次四舍五入,避免多次rounding导致的精度误差。
内容的提问来源于stack exchange,提问作者Cross
相关产品推荐
相关产品推荐

