展示的数据内容是同事提供,表名,列名的命名不规范,表结构设计的也不合理
切记不可使用拼音,这里我是为了解决同事的问题(表结构同事测试写的,我就没修改)

今天写项目时,需要将一个车辆的所有费用做汇总处理,包括加油费和保险事故等等
刚开始使用左连接,然后对加油表和保险表的费用一栏用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

连接去重

  1. 针对查询字段去重可以使用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

在这里插入图片描述

  1. 针对查询到的数据去重可以使用DISTINCT

    使用 DISTINCT

    select DISTINCT b.id,b.plate_number
    from base b
    left join baoxian bx
    on b.id=bx.plate_number
    

对SQL的理解不是特别深入,可能存在一些问题,如有错误 欢迎大家指点,感谢!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐