在两个不同子表上的LEFT OUTER JOIN上的SUM

Jam*_*mes 0 sql sqlite

我有以下表架构

在此输入图像描述

我想要做的是返回所有发票以及以下汇总总数

  • 所有订单项的UnitPrice*数量总计(例如SUM(UnitPrice * Qty))
  • 所有额外费用的总额(例如SUM(Amount))

鉴于发票可以在没有任何行项目或额外成本的情况下存在,我认为我在这里需要做的就是使用LEFT OUTER JOINie

SELECT i.*, SUM(li.UnitPrice * li.Qty) As [Sub Total], SUM(ac.Amount) As [AdditionalCosts]
FROM Invoice i
LEFT OUTER JOIN LineItem li ON li.InvoiceId = i.Id
LEFT OUTER JOIN AdditionalCost ac ON ac.InvoiceId = i.Id
GROUP BY i.Id
Run Code Online (Sandbox Code Playgroud)

但问题是,如果两个子表的长度不同(例如,我有4个行项目,但只有1个额外成本),额外成本的数据会在额外的行项目行中重复(反之亦然),您可以通过删除来验证这一点GROUP BY.

所以会有效地发生以下记录

Invoice
-------
400001

LineItem
---------
400001 | 2000 | 100 | 1
400001 | 2001 | 50  | 2
400001 | 2002 | 10  | 10
400001 | 2003 | 20  | 5

AdditionalCost
--------------
1 | 400001 | 30
2 | 400001 | 70
Run Code Online (Sandbox Code Playgroud)

我的结果集看起来像

Id    | Sub Total  | Additional Costs
--------------------------------------
40001 | 800        | 400 <-- this should be 100
Run Code Online (Sandbox Code Playgroud)

如何SUM独立计算每个表并将它们组合成一个主记录?

Lam*_*mak 5

这应该工作:

SELECT i.*, li.[Sub Total], ac.[AdditionalCosts]
FROM Invoice i
LEFT OUTER JOIN (SELECT InvoiceID, SUM(UnitPrice*Qty) As [Sub Total]
                 FROM LineItem
                 GROUP BY InvoiceID) li 
    ON li.InvoiceId = i.Id
LEFT OUTER JOIN (SELECT InvoiceID, SUM(Amount) As [AdditionalCosts]
                 FROM AdditionalCost
                 GROUP BY InvoiceID) ac 
    ON ac.InvoiceId = i.Id
Run Code Online (Sandbox Code Playgroud)