MySQL Left Join左连接后对数据做SUM汇总处理时出现数据倍数增长问题(左连接SUM数据重复问题)【已解决】
展示的数据内容是同事提供,表名,列名的命名不规范,表结构设计的也不合理切记不可使用拼音,这里我是为了解决同事的问题(表结构同事测试写的,我就没修改)今天写项目时,需要将一个车辆的所有费用做汇总处理,包括加油费和保险事故等等刚开始使用左连接,然后对加油表和保险表的费用一栏用SUM进行处理,代码如下:select b.id,b.plate_number,SUM( bx.pay_money),SUM(o
展示的数据内容是同事提供,表名,列名的命名不规范,表结构设计的也不合理
切记不可使用拼音,这里我是为了解决同事的问题(表结构同事测试写的,我就没修改)
今天写项目时,需要将一个车辆的所有费用做汇总处理,包括加油费和保险事故等等
刚开始使用左连接,然后对加油表和保险表的费用一栏用SUM进行处理,代码如下:
select b.id,b.plate_number,SUM( bx.pay_money),SUM(o.money)
from base b
left join baoxian bx
on b.id=bx.plate_number
left join oil o
on b.id=o.plate_number
GROUP BY b.id
下面是查询结果:
这里的o.money应该是100才对,因为我只存储了一条数据
在保险表(baoxian)中针对plate_number为鲁A6584p我存储了四条保险数据
原因
因为在左连接时对baoxian表中的多条数据进行查询,会查询出四条数据然后进行pay_money字段的累加,同时后面的oil表中也会累计相加多遍
解决:
将保险和加油表中查询到的数据存储到一个临时表中,临时表名叫作bx
(select SUM(pay_money) AS bx_money,plate_number from baoxian GROUP BY plate_number) AS bx
这个表中的数据为
然后通过临时表bx的plate_number进行左连接,和车辆表做聚合处理;同理,对加油表也做同样的处理,这样就不会出现数据的重复问题。
下面展示一下完整的SQL:
select b.*,bx.bx_money,o.oil_money,jq.jq_money
from base b
left join (select SUM(pay_money) AS bx_money,plate_number from baoxian GROUP BY plate_number) AS bx
on b.id=bx.plate_number
left join (select SUM(money) AS oil_money,plate_number from oil GROUP BY plate_number) AS o
on b.id=o.plate_number
left join (select SUM(money) AS jq_money,plate_number from jiaoqiang GROUP BY plate_number) AS jq
on b.id=jq.plate_number
连接去重
-
针对查询字段去重可以使用GROUP BY
select b.id,b.plate_number,bx.pay_money from base b left join baoxian bx on b.id=bx.plate_number
使用GROUP BY 进行分组处理
select b.id,b.plate_number
from base b
left join baoxian bx
on b.id=bx.plate_number
GROUP BY b.id
-
针对查询到的数据去重可以使用DISTINCT
使用 DISTINCT
select DISTINCT b.id,b.plate_number from base b left join baoxian bx on b.id=bx.plate_number
对SQL的理解不是特别深入,可能存在一些问题,如有错误 欢迎大家指点,感谢!
更多推荐
所有评论(0)