2016-08-03 3 views
1

私は列の合計を持つ表請求書を持っています。次に、私は列の金額を持つテーブル支払を持っています(通常、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; 

結局、これは請求書がバランス負っているものを示した図になります私が持っているものです。私がサブクエリのどこを削除すればそれは私に答えを与えるが、それはすべての支払いの合計である。私はちょうどその請求書の支払いの合計が欲しい。どんな助けもありがとう。私はあなたがpaymentsテーブルの上にjoiningあるので、クエリが複数の結果(支払につき重複を)返している疑いがある

おかげ

+0

そして、あなたの質問は何ですか?あなたの質問は大丈夫だろう。 –

+0

一般的なヒントとして、メインクエリと同じサブテーブルクエリで同じテーブルエイリアスを再利用しないでください。 – jarlh

答えて

0

これには2つのアプローチがあります。サブクエリまたはグループ化することができます。副問合せを実行している場合は、主問合せに表は必要ありません。また、Paymentsへの内部結合は、支払いのない請求書が照会によって戻されないことを意味します。 Group By例の左外部結合に変更すると、I.Invoice_Id = P.Invoice_Idが満たされていない場合に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オプションを含んでいるのが好きですが、支払いが行われてから見積もりが請求書になるまでは請求書を作成しません。私は答えとしてマークする方法を理解しようとしています....ありがとうagain – Mark

+0

これを把握しようとしているので、集計関数の合計以外のすべてでグループ化します。また、サブクエリを実行すると、サブクエリのテーブルに参加しません。再度ありがとう – Mark

+0

正確に。集計関数(Max、Min、Avg、Sumなど)を使用している場合は、他のすべての列でグループ化する必要があります。 –

0

1つのオプションは、joinpaymentsテーブルに削除することです。ここでjoincorrelated subqueryを移動させ、代替オプションがあります:

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

これは、エラーが発生しました====メッセージ156、レベル15、状態1、行8 'inner'キーワードの構文が正しくありません。 メッセージ156、レベル15、状態1、行11 'as'というキーワードの構文が正しくありません。 =====私はあなたの助けに本当に感謝しています...上記のスティーブの答えは働いたが、本当に助けてくれてありがとう。 – Mark

+0

@マーク - 私の推測はそこの ';'です - ただそれを削除してください...あなたの問題は解決してうれしいですが... – sgeddes

関連する問題