2016-08-03 92 views
1

我有一個表總計列發票。然後我有一張表格(通常有多張付款到一張發票​​)。我需要列出餘額,即Invoice.Total的差額 - (在該發票上進行的付款總額)。這就是我(呵呵雅Azure的使用SQL Server)的如何在子查詢中使用主查詢中的列?

select I.Invoice_Id, 
     I.Total - (select sum(Amount) from Payments P 
        where I.Invoice_Id = P.Invoice_Id) as Balance, 
     Q.Quote_Id, 
     Q.Description, 
     Q.Vendor_Num 
from Invoice as I 
    inner join Payments as P on I.Invoice_Id = P.Invoice_Id 
    inner join Quote as Q on Q.Quote_Id = I.Quote_Id; 

最終,這將是展示的發票已經欠平衡什麼看法。如果我刪除子查詢中的位置,它會給我一個答案,但它是所有付款的總和。我只想要該發票上的付款總額。任何幫助,將不勝感激。

感謝

+0

什麼是你的問題?您的查詢似乎沒問題。 –

+0

一般性技巧,不要在子查詢中重複使用與主查詢中相同的表別名。 – jarlh

回答

0

有兩種方法可供。你可以通過子查詢或分組。如果你正在做一個子查詢,你不需要主查詢中的表。此外,支付的內部聯接意味着沒有支付的發票將不會被查詢返回。在未滿足I.Invoice_Id = P.Invoice_Id時,將其更改爲Group By示例中的左外連接將返回NULL行。

組方:

SELECT I.Invoice_Id, 
     I.Total - sum(ISNULL(P.Amount,0)) AS Balance, 
     Q.Quote_Id, 
     Q.Description, 
     Q.Vendor_Num 
    FROM Invoice AS I 
    JOIN Quote AS Q on Q.Quote_Id = I.Quote_Id 
    LEFT JOIN Payments AS P on I.Invoice_Id = P.Invoice_Id 
GROUP BY I.Invoice_Id, I.Total, Q.Quote_Id, Q.Description, Q.Vendor_Num 

子查詢:

SELECT I.Invoice_Id, 
     I.Total - (SELECT ISNULL(SUM(Amount),0) FROM Payments P WHERE P.Invoice_Id = I.Invoice_Id) AS Balance, 
     Q.Quote_Id, 
     Q.Description, 
     Q.Vendor_Num 
    FROM Invoice AS I 
    JOIN Quote AS Q on Q.Quote_Id = I.Quote_Id 
+0

史蒂夫你是一個SQL怪物....複製粘貼組選項到新的查詢而繁榮正是我所期待的。只是爲了完成我試過子查詢選項,它也很完美。我喜歡你包括isnull選項,但我不會創建一個發票,直到付款已成爲一個報價成爲發票的方式。我將嘗試弄清楚如何將此標記爲答案....再次感謝 – Mark

+0

試圖弄清楚這一點,所以除了聚合函數總和以外,所有的東西都可以分組。如果您執行子查詢,則不會在子查詢中加入表。再次感謝 – Mark

+0

沒錯。如果您使用任何聚合函數(最大值,最小值,平均值,總和等),則需要按所有其他列進行分組。 –

0

我懷疑你的查詢(每支付一式兩份)返回多個結果,因爲你是joiningpayments表。

一種選擇是將join刪除到payments表。下面是其移動correlated subqueryjoin另一種選擇:

select I.Invoice_Id, 
     I.Total - p.SumAmount as Balance, 
     Q.Quote_Id, 
     Q.Description, 
     Q.Vendor_Num 
from Invoice as I 
    inner join Quote as Q on Q.Quote_Id = I.Quote_Id; 
    inner join (
     select invoice_id, sum(amount) SumAmount 
     from Payments 
     group by invoice_id) as P on I.Invoice_Id = P.Invoice_Id 
+0

嘗試獲得錯誤==== Msg 156,Level 15,State 1,Line 8 關鍵字'inner'附近的語法不正確。 Msg 156,Level 15,State 1,Line 11 關鍵字'as'附近的語法不正確。 =====我真的很感謝你的幫助......史蒂夫上面的答案很有效,但我非常感謝你的幫助。 – Mark

+0

@Mark - 我的猜測是''''在那裏 - 只是刪除它...很高興你的問題得到解決儘管如此... – sgeddes

相關問題