SQL JOIN,GROUP BY在三个表上获取总计

12 sql join aggregate

我继承了以下数据库设计.表是:

customers
---------
customerid  
customernumber

invoices
--------
invoiceid  
amount

invoicepayments
---------------
invoicepaymentid  
invoiceid  
paymentid

payments
--------
paymentid  
customerid  
amount
Run Code Online (Sandbox Code Playgroud)

我的查询需要返回给定客户编号的invoiceid,发票金额(在发票表中)和应付金额(发票金额减去对发票的任何付款).客户可能有多张发票.

当对发票进行多次付款时,以下查询为我提供了重复记录:

SELECT i.invoiceid, i.amount, i.amount - p.amount AS amountdue
FROM invoices i
LEFT JOIN invoicepayments ip ON i.invoiceid = ip.invoiceid
LEFT JOIN payments p ON ip.paymentid = p.paymentid
LEFT JOIN customers c ON p.customerid = c.customerid
WHERE c.customernumber = '100'
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

Sag*_*chi 15

我不确定我有你,但这可能是你想要的:

SELECT i.invoiceid, sum(case when i.amount is not null then i.amount else 0 end), sum(case when i.amount is not null then i.amount else 0 end) - sum(case when p.amount is not null then p.amount else 0 end) AS amountdue
FROM invoices i
LEFT JOIN invoicepayments ip ON i.invoiceid = ip.invoiceid
LEFT JOIN payments p ON ip.paymentid = p.paymentid
LEFT JOIN customers c ON p.customerid = c.customerid
WHERE c.customernumber = '100'
GROUP BY i.invoiceid
Run Code Online (Sandbox Code Playgroud)

如果每张发票有多个付款行,这将为您提供金额总和


Nic*_*ein 6

非常感谢您的回复!

Saggi Malachi,该查询很遗憾地在有多个付款的情况下汇总发票金额.假设有一笔价值18美元和12美元的39美元发票有两笔付款.因此,而不是结果看起来像:

1   39.00   9.00
Run Code Online (Sandbox Code Playgroud)

你最终得到:

1   78.00   48.00
Run Code Online (Sandbox Code Playgroud)

Charles Bretana,在我的查询到最简单的查询的过程中,我(愚蠢地)省略了另一个表customer DIvoices,它提供了客户和发票之间的链接.这可用于查看尚未付款的发票.

经过多次努力,我认为以下查询返回我需要的内容:

SELECT DISTINCT i.invoiceid, i.amount, ISNULL(i.amount - p.amount, i.amount) AS amountdue
FROM invoices i
LEFT JOIN invoicepayments ip ON i.invoiceid = ip.invoiceid
LEFT JOIN customerinvoices ci ON i.invoiceid = ci.invoiceid
LEFT JOIN (
  SELECT invoiceid, SUM(p.amount) amount
  FROM invoicepayments ip 
  LEFT JOIN payments p ON ip.paymentid = p.paymentid
  GROUP BY ip.invoiceid
) p
ON p.invoiceid = ip.invoiceid
LEFT JOIN payments p2 ON ip.paymentid = p2.paymentid
LEFT JOIN customers c ON ci.customerid = c.customerid
WHERE c.customernumber='100'
Run Code Online (Sandbox Code Playgroud)

你们同意吗?