GROUP BY子句报错求助:添加字段后无法生成汇总查询
解决SQL GROUP BY报错并获取正确重量汇总的方案
我来帮你搞定这个问题,你的核心痛点是既要解决GROUP BY的语法错误,又要拿到整个项目的重量汇总结果,而不是按单个运输记录拆分的数据。
问题原因分析
你原来的查询里,子查询引用了外部的ProjShipp.id,但主查询的GROUP BY只包含了ProjInfo.ProjectN。SQL的规则是:SELECT列表里的非聚合列必须要么在GROUP BY里,要么被聚合函数包裹。所以引擎会报错说ProjectShipping.id不符合要求。但如果把ProjShipp.id加入GROUP BY,查询会按每个运输记录分组,结果就变成了每条运输记录的单独数据,而不是整个项目的汇总,这显然不是你想要的。
调整后的查询语句
我们可以把原来的关联子查询改成一个预聚合的子查询,先计算每个运输记录对应的生产重量总和,再和主查询关联后按项目汇总:
SELECT ProjInfo.ProjectN AS BS, COALESCE(SUM(fab_weight.weight_fab), 0) AS 'weight fab', SUM(ProjShipp.[Weight] * ProjShipp.ShippingNavisionQty) AS 'weight Shipp' FROM ProjectShipping ProjShipp INNER JOIN ProjectInfo ProjInfo ON ProjInfo.id = ProjShipp.IdProject LEFT JOIN ( -- 预计算每个运输记录对应的生产重量总和 SELECT DailyPaintProduction.FK_idPartShip, SUM(ProjectShipping.[Weight] * DailyPaintProduction.[Quantity]) AS weight_fab FROM DailyPaintProduction INNER JOIN ProjectShipping ON ProjectShipping.id = DailyPaintProduction.FK_idPartShip INNER JOIN ProjectInfo ON ProjectInfo.id = ProjectShipping.IdProject WHERE DailyPaintProduction.FK_idNextProcess = 13 AND ProjectInfo.FK_Status != 'VENDRE DES MATIERES PREMIERES' GROUP BY DailyPaintProduction.FK_idPartShip ) fab_weight ON fab_weight.FK_idPartShip = ProjShipp.id WHERE ProjInfo.ProjectN = 'BS-00799' GROUP BY ProjInfo.ProjectN ORDER BY ProjInfo.ProjectN
关键调整说明
- 预聚合子查询:把原来的关联子查询抽出来变成
fab_weight,先按FK_idPartShip(也就是运输记录ID)分组,计算每条运输记录对应的生产重量总和,这样避免了主查询的分组冲突。 - LEFT JOIN + COALESCE:用LEFT JOIN确保即使某些运输记录没有对应的生产数据,也会被保留在结果里;COALESCE把NULL值转换成0,避免汇总结果出现空值。
- 主查询仅按项目分组:主查询的GROUP BY只保留
ProjInfo.ProjectN,这样就能得到整个项目的weight fab和weight Shipp的汇总值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者M.Bouabdallah
相关产品推荐
相关产品推荐

