2016-08-16 103 views
0

我有一个主表“合同”与一个id(主键)和一些列我必须汇总为每一行。 我的第二张表“支付”与“合同”有1至n的关系,对于“合同”中的每一行,“支付”中有零到几行。结合两个选择不同的行数和一个组

我可以选择 “contrats” - 表这样:

select c.Id, sum(c.field1 + c.field2 + c.field3) as TotalC from contracts c group by c.Id 

我可以从 “费” - 表像选择:

select p.Id, sum(p.field1) from payments p group by p.Id 

所以c.Id和p.Id有关系。两份选择都会为每个合约ID提供一行。但并非每个合同都有付款。是否有可能以合理的方式将这两项选择结合起来?或者我会更好地在我的程序中获得这两个选择,并在sql之外进行比较?

我可以使用一个INNER JOIN像scaisEdge建议,但 我有这个问题是:

选择的结果之前,它被分为:

 
ID | TotalContractSum | SinglePayment 
22 | 50,00 | 25,00 
22 | 50,00 | 30,00 

结果后,分组(在endresult ):

 
22 | 100,00 | 55,00 

现在SinglePayment按照它应该组合在一起,但TotalContractSum已经翻了一番,因为有两行在付款表中。总之,分组是这里的问题。

+0

如果不应该使用单排和:通过p.Id选择p.Id,总和(p.field1)从支付P组,是相同的选择P。 Id,p.field1 from payment p –

+0

请提供两个表格的结构。只是想知道这两张表之间是否有任何关系。 –

+1

这类问题可能是设计不佳的症状 – Strawberry

回答

0

您可以使用内部联接

select c.Id, sum(c.field1 + c.field2 + c.field3) as TotalC , sum(p.field1) 
from contracts c 
INNER JOIN payments p 
ON c.id = p.id 
group by c.I 
+0

感谢您的建议。我在网上发现了类似的问题,但问题在于此。 – BionicWave

+0

最终更新您的帖子并显示数据样本和预期结果 – scaisEdge