2017-05-06 50 views
2

我试图做一些我认为非常简单的事情,但无法在SQL语句中弄明白。 该表从两个表中求和,并与第三个表中的值进行比较

  1. 发票(列 - GrossAmount)

  2. 收据(列 - ReceiptValue,有可能是一个收据或没有收据的话)

  3. 信用票据(列 - GrossCredit,可能有信用票据或没有)

我想显示总未清发票,即显示所有发票其中Invoices.GrossAmount > (sum(Receipt.ReceiptValue) + sum(CreditNotes.GrossCredit))

查询需要显示所有未完全支付或未支付的发票。

InvoiceId在所有表中与外键相同。

使用的MS SQL Server 2014

+1

编辑你的问题,并提供样本数据和预期的结果。 –

回答

1

你需要总结每个表单独(按发票分组),然后按[左]连接的结果:

SELECT i.InvoiceId 
FROM invoices i 
LEFT JOIN (SELECT InvoiceId, SUM(ReceiptValue) AS sum_receipt 
      FROM  receipts 
      GROUP BY InvoiceId) r ON i.InvoiceId = r.InvoiceId 
LEFT JOIN (SELECT InvoiceId, SUM(GrossCredit) AS sum_credit 
      FROM  credit 
      GROUP BY InvoiceId) g ON i.InvoiceId = g.InvoiceId 
WHERE  i.GrossAmount > COALESCE(sum_receipt, 0) + COALESCE(sum_credit, 0) 
+0

谢谢Mureinik! – Aayan

0

我想你想是这样的:

select i.*, 
     coalesce(r.sumrv, 0) as receiptValue, 
     coalesce(c.sumgc, 0) as grossCredits 
from invoices i left join 
    (select invoiceId, sum(receiptvalue) as sumrv 
     from receipts 
     group by invoiceId 
    ) r 
    on i.invoiceId = r.invoiceId left join 
    (select invoiceId, sum(grosscredit) as sumgc 
     from credits c 
     group by invoiceId 
    ) c 
    on i.invoiceId = c.invoiceId 
where i.GrossAmount > coalesce(r.sumrv, 0) + coalesce(c.sumgc, 0); 

三个重要的事情:

  • 使用left join这样你就不会没有下降发票匹配一个或两个表中的记录。
  • 使用coalesce()所以NULL值被视为0
  • 在加入表格之前,请执行汇总
+0

谢谢Gordon Linoff! – Aayan

相关问题