基于相同No.Order字段值多费用求和的MySQL查询问题
原SQL存在的问题
- 求和表达式拼写错误:
SUM(Fee1+Fee2+Fee3+Fee+Fee5+Fee6)中出现了不存在的字段Fee,漏了Fee4字段 - 分组逻辑不符合需求:目标是按
No.Order分组统计全订单总费用,但原语句GROUP BY同时加了City字段,同一个订单下不同城市的记录会被拆分为多个独立分组,无法得到整个订单的合计值 - 字段选择不符合分组规范:主流数据库要求SELECT子句中的非聚合字段必须出现在GROUP BY子句中,原语句SELECT里的ID、Date、Lic.Plate等字段既没有加入GROUP BY,也没有加聚合函数,执行会直接报错
另外如果你的数据库对带特殊符号的字段名敏感(比如字段名里的.),需要用反引号将这类字段名包裹,比如`No.Order`避免语法错误。
修正后的SQL(分两种场景)
场景1:仅需输出每个订单的总费用(匹配你给出的预期结果)
SELECT `No.Order`, SUM(Fee1 + Fee2 + Fee3 + Fee4 + Fee5 + Fee6) AS order_total FROM tborder INNER JOIN tbmobil on tbmobil.idmobil = tborder.idmobil INNER JOIN tbsj ON tbsj.noorder = tborder.noorder INNER JOIN tbinvdet on tbsj.idsj = tbinvdet.idsj LEFT JOIN tbso ON tbso.idsj = tbsj.idsj GROUP BY `No.Order`
执行后ORD-00005的order_total为1770000,ORD-00006的order_total为250000,完全符合你的预期。
场景2:需要保留所有明细行,同时每行附带对应订单的总费用
如果需要查看每条记录的原始明细,同时显示所属订单的总费用,可以用窗口函数实现,不需要分组:
SELECT City, ID, Date, `Lic.Plate`, `No.Order`, Dest, Fee1, Fee2, Fee3, Fee4, Fee5, Fee6, SUM(Fee1 + Fee2 + Fee3 + Fee4 + Fee5 + Fee6) OVER (PARTITION BY `No.Order`) AS order_total FROM tborder INNER JOIN tbmobil on tbmobil.idmobil = tborder.idmobil INNER JOIN tbsj ON tbsj.noorder = tborder.noorder INNER JOIN tbinvdet on tbsj.idsj = tbinvdet.idsj LEFT JOIN tbso ON tbso.idsj = tbsj.idsj
内容的提问来源于stack exchange,提问作者Imam
相关产品推荐
相关产品推荐

