我继承了以下数据库设计.表是:
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)
如果每张发票有多个付款行,这将为您提供金额总和
非常感谢您的回复!
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)
你们同意吗?