2012-01-24 3 views
-2

私は2つの表は、AとB 今すぐテーブルAの構造は、そのSQL Sever 2005のLeft Outer Joinで2つの列の差異を見つける方法は?

id  stock 
37  1 
40  1 
37  1 
40  1 
37  1 
37  1 

のようなもので、Bは、今私は、クエリを書きたいという

id  stock 
37  1 
37  1 
40  1 

のようなものであると仮定したとしましょう 持っていますそれは私に特定のid株式の合計を与える(テーブルA - テーブルB)、そのIDがテーブルBに存在しない場合は、Aからの在庫だけです。そう私はそのような結果を期待します

id  stock 

40  1 
37  2 

私は左の可能なオプションここになります参加することを考えて、私はその

SELECT A.id, 
    SUM(CAST(isNull(A.Stock, 0) as int) - CAST(isNull(B.Stock, 0) as int))'Stock' 
    from A 
    LEFT OUTER JOIN 
    B 
    ON A.id = B.id 
    group by A.id 

しかし、問題のようなクエリは以下に示すように上記のクエリが必要なレコードが、間違った数量/ Stocklevelを与えるということです書き込み:

id  stock 
37  0 
40  1 

ストックレベルの問題を解決する方法を教えてください。

+0

AとBとの間の唯一の関係はimplictly ROWNUMBERを介して与えられますか。それはテーブルデザインの1つの地獄です。 –

+0

私はこれらの結果が与えられた入力に対して正確であることを非常に疑う。 ID4には何が起こったのですか?なぜ3のid = 1がまだあるのですか? –

+0

表AおよびBでは、これらの表内の他の項目のためにIDが繰り返されます。 –

答えて

4

私はこのようなものを探していますね。

select A.id, A.SumA - coalesce(B.SumB, 0) as stock 
from (
     select A.id, sum(A.stock) as SumA 
     from A 
     group by A.id 
    ) as A 
    left outer join 
    (
     select B.id, sum(B.stock) as SumB 
     from B 
     group by B.id 
    ) as B 
    on A.id = B.id    

結果:

id   stock 
----------- ----------- 
37   2 
40   1 

SE Data

+2

質問の結果は別のユーザーによって変更されました。これはOPが最初に書いた結果と同じではありませんが、彼が意味していたものと非常によく似ています。 OPのチンミングがなければ、知る方法はありません(そしてOPは静かです* vewy vewy *)。 –

+0

@ M.NasserJavaid - 私のクエリはあなたの期待した結果を与えます。何が欠けている? –

+0

@Mikaelありがとうございました。 –

0
SELECT A.id, A.Stock - isNull(B.stock, 0) as Stock from A 
LEFT OUTER JOIN B 
ON A.id = B.id 

これは私の考えです。
PS。あなたのケースのシナリオに含まれていないものをグループ化します。あなたの期待した結果も私には分かりません(あなたの問題の説明と矛盾します)。

関連する問題