一对多用left join 的关系。

首先我们给定三张表 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或者正负想减)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值