2012-09-07 53 views
2

我遇到了从单个SQL语句中的多个表中提取Sum的问题。从多个表中获取总和

我有三个表tblCases,tblTimesheetEntries和tblInvoices tblCases和其他两个表之间有一对多的关系。

我使用下面的SQL语句,此刻

SELECT c.CaseNo, SUM(i.InvFees), SUM(t.Fees) 
FROM tblCases AS c 
INNER JOIN tblInvoices AS i ON c.CaseNo = i.CaseNo 
INNER JOIN tblTimesheetEntries AS t ON c.CaseNo = t.CaseNo 
GROUP BY c.CaseNo 
ORDER BY c.CaseNo; 

不过,这似乎重复发票金额。例如,如果案例中只有一张发票,但说4个时间表条目,它会计算4 x发票金额作为该表的总和。

如果我参加了分组并运行下面的SQL来代替:

SELECT c.CaseNo, i.InvFees, t.Fees 
FROM tblCases AS c 
INNER JOIN tblInvoices AS i ON c.CaseNo = i.CaseNo 
INNER JOIN tblTimesheetEntries AS t ON c.CaseNo = t.CaseNo  
ORDER BY c.CaseNo; 

我可以看到这种情况的发生,因为所有的4线重复发票金额如

Case 1001, Inv 001 950.00, TimeFees 250.00 
Case 1001, Inv 001 950.00, TimeFees 175.00 
Case 1001, Inv 001 950.00, TimeFees 225.00 
Case 1001, Inv 001 950.00, TimeFees 190.00 

所以总的发票是发票的四倍量001

我想从上面的数据恢复是一个单一的总和行:

Case 1001, Total Invoices 950.00, Total TimeFees 840.00 

怎么办我在总结中避免了这种重复?

+0

我修改后展现样的结果我之后。 – PJW

回答

5
SELECT c.CaseNo, 
     i.InvFees, 
     t.Fees 
FROM tblCases AS c 
     INNER JOIN (SELECT CaseNo, 
          Sum(InvFees) AS InvFees 
        FROM tblInvoices 
        GROUP BY CaseNo) AS i 
     ON c.CaseNo = i.CaseNo 
     INNER JOIN (SELECT CaseNo, 
          Sum(Fees) AS Fees 
        FROM tblTimesheetEntries 
        GROUP BY CaseNo) AS t 
     ON c.CaseNo = t.CaseNo 
ORDER BY c.CaseNo; 
+0

+1你不需要外层的'SUM'和'GROUP BY'。 –

+0

超级!谢谢 – PJW

0

尝试:

SELECT c.CaseNo, i.InvFees, sum(t.Fees) 
FROM tblCases AS c 
INNER JOIN tblInvoices AS i ON c.CaseNo = i.CaseNo 
INNER JOIN tblTimesheetEntries AS t ON c.CaseNo = t.CaseNo  
group by c.CaseNo, i.InvFees