首先我们给定三张表 p_Project,cb_Contract,cb_HTFKApply,分别代表项目、合同和付款申请。
三张表的关系为:p_Project < cb_Contract < cb_HTFKApply ‘<’代表的是一对多关系。
一、先以一作为左表:
select a.p_projectId,a.ProjName,
SUM(c.TotalPayAmount) SumTotalPayAmount
from p_Project a
left join cb_Contract b on a.p_projectId = b.ProjGUID
left join cb_HTFKApply c on b.ContractGUID = c.ContractGUID
group by a.p_projectId,a.ProjName
-- having SUM(c.TotalPayAmount) is not null
(可以看到数据为960行,但是支付金额求和有很多为null的情况发生,这是为什么呢,因为p_Project 作为左表,左表显示全部数据,一对多的情况下,项目也有可能没有合同,这个时候会有Null填充这个项目下合同和付款申请的字段)
二、以多作为主表:
select c.p_projectId,c.ProjName,
SUM(a.TotalPayAmount) SumTotalPayAmount
from cb_HTFKApply a
left join cb_Contract b on a.ContractGUID = b.ContractGUID
left join p_Project c on b.ProjGUID = c.p_projectId
group by c.p_projectId,ProjName
(可以看到数据为48行,这是因为项目下,对应合同的付款申请只有48个,且金额求和的时候是有数据的,求和为0说明当时申请的金额为0或者正负想减)