2016-09-13 8 views
1

私はここで二つのテーブルSQL Server 2012のマージ値

tblA(sn, ID int pk, name varchar(50), amountA decimal(18,2)) 

tblB(ID int fk, amountB decimal(18,2)) 

を持っている:TBLAは一度だけoccuresとTBLBは、複数の時間 をoccureも、私は、データを表示するために、クエリを必要としますlike:

sn ID name AmountA amountB Balance 
1 1001 abc 5000.00   5000.00 
2 1002 xyz 10000.00 
    1002    4000.00 6000.00 (AmountA-AmountB) 
3 1003 pqr 15000.00 
    1003    4000.00 
    1003    3000.00 
    1003    2000.00 6000.00 (AmountA-sum(AmountB)) 

混乱がある場合は質問してください 私は使ってみました遅れと鉛の機能が、私は欲望の結果を得ることができなかった、助けてください。

+0

実行中の残高がすべての行に表示されても問題ありませんか? –

+0

Giorgosに感謝します。私は欲望の出力を見つけるのを助けてください。 –

+0

使用しているSQL Serverのバージョンは何ですか? –

答えて

1

は、SQL Server 2012を使用しているので、あなたは、集計関数(SUM)でパーティションを使用することができます。

SELECT t.sn, 
     t.ID, 
     t.name, 
     t.credits AS AmountA, 
     t.debits AS amountB, 
     SUM(t.credits - t.debits) OVER (PARTITION BY t.ID ORDER BY t.debits, t.credits) AS Balance 
FROM 
(
    SELECT sn, 
      ID, 
      name, 
      AmountA AS credits, 
      0 AS debits 
    FROM tblA 
    UNION ALL 
    SELECT 0 AS sn, 
      ID, 
      NULL AS name, 
      0 AS credits, 
      amountB AS debits 
    FROM tblB 
) t 
ORDER BY t.ID, 
     t.debits, 
     t.credits 

説明:それぞれが表すテーブルAとBのレコード以来

UNIONクエリを使用して両方のデータセットを1つのテーブルにまとめる単一トランザクション(すなわち、クレジットまたはデビット)がここでうまく機能します。その後、各レコードについて、IDパーティショングループごとに、貸方と借方の差を使用してローリング合計を計算します。下位に借方が表示されている間、クレジットが各パーティションの上部に表示されるように、注文が選択されます。

+0

良いアイデアだが、tblBのデータが最初に来る、それは最初のtblAと次の行のtblBですか?これは次のようになります:

1 \t 1001 \t abc \t 5000.00 \t 0.00 \t 5000.00 0 \t 1002 \t NULL \t 0.00 \t 4000.00 \t -4000.00 2 \t 1002 \t xyz \t 10000.00 \t 0.00 \t 6000.00 0 \t 1003 \t NULL \t 0.00 \t 4000.00 \t -9000.00 0 \t 1003 \t NULL \t 0.00 \t 3000.00 \t -9000.00 0 \t 1003 \t NULL \t 0.00 \t 2000.00 \t -9000.00 3 \t 1003 \t pqr \t 15000.00 \t 0.00 \t 6000.00

+1

このコメントは遠隔では役に立ちません。あなたが得たアウトプットと、なぜそれが間違っていると思うのかを_describe_してください。 –

+0

ありがとうございました。再びありがとう。 –