2017-06-20 17 views
2

同じIDを持つ値の合計を、別の列の対応する値(これらは同じデータを持つ)で減算します。列AMTの値が差異だけを行う1回だけである場合。2つのテーブルを引き算する方法

AMT(テーブルA)とAMT(テーブルB)のID、CRD、STN、TYPEが同じである必要があります。

表A:

AMT  ID  CRD  STN  TYPE 
------- ------- ------- ------- ---- 
22000 7123344 556677 442233 0200 
22000 7123344 556677 442233 0200 
22000 7123344 556677 442233 0200 
11500 7132323 992211 556611 0200 
10000 7132323 992211 556611 0200 
35200 7199933 223344 989898 0200 

表B:

AMT  ID  CRD  STN  TYPE 
------- ------- ------- ------- ---- 
67000 7123344 556677 442233 0220 
20000 7132323 992211 556611 0220 
35300 7199933 223344 989898 0220 

結果、私が取得したい:

DIFF 
---- 
1000 
-1500 
100 
+1

それがで参加して、グループをやって、かなり基本的なクエリになりますこれを達成する。多くのSQLを書いたことがありますか? – slambeth

+1

あなたが試したことと、それがうまくいかない理由を実際に表示する必要があります。なぜ3番目の違いが100であるのですか - それはIDですか?そして、どちらか一方のテーブルだけにあるデータに違いが必要ですか?違いの絶対値は(あなたの例では、最初の2つのうちの1つは正でもう1つは負です)? –

+1

訂正しました。よろしく、 –

答えて

2

あなたのサンプル出力は、実際のテーブルのデータと一致していません;私達はちょうど100値を無視することができる場合、あなたはおそらくこのような何かをしたい(のCTEで与えるテーブルデータ):

with table_a (AMT, ID, CRD, STN, TYPE) as (
      select 22000, 7123344, 556677, 442233, 0200 from dual 
    union all select 22000, 7123344, 556677, 442233, 0200 from dual 
    union all select 22000, 7123344, 556677, 442233, 0200 from dual 
    union all select 11500, 7132323, 992211, 556611, 0200 from dual 
    union all select 10000, 7132323, 992211, 556611, 0200 from dual 
    union all select 35200, 7178866, 223344, 989898, 0200 from dual 
), 
table_b (AMT, ID, CRD, STN, TYPE) as (
      select 67000, 7123344, 556677, 442233, 0220 from dual 
    union all select 20000, 7132323, 992211, 556611, 0220 from dual 
    union all select 67100, 7199933, 667733, 343433, 0220 from dual 
) 
select a.id, a.crd, a.stn, a.sum_amt, b.sum_amt, a.sum_amt - b.sum_amt as diff 
from (
    select id, crd, stn, type, sum(amt) as sum_amt 
    from table_a 
    group by id, crd, stn, type 
) a 
inner join (
    select id, crd, stn, type, sum(amt) as sum_amt 
    from table_b 
    group by id, crd, stn, type 
) b 
on b.id = a.id and b.crd = a.crd and b.stn = a.stn and b.type != a.type 
order by a.id, a.crd, a.stn; 

     ID  CRD  STN SUM_AMT SUM_AMT  DIFF 
---------- ---------- ---------- ---------- ---------- ---------- 
    7123344  556677  442233  66000  67000  -1000 
    7132323  992211  556611  21500  20000  1500 

サブクエリ(インライン・ビュー)は、各ID/CRD/STN/TYPEのための合計を生成し、これらは結合され、等価な合計を減算することができます。それでも、あなたの結果は両方とも正の数です。それはあなたが望むものであるならば、あなただけの

abs(a.sum_amt - b.sum_amt) as diff 

を行うには、それを修正することができます。また、減算は、他の道を行くする場合がありますので、あなたは+1000と-1500を取得します。

それはあなたが、テーブルAにのみ存在で組み合わせに対する差をつけたいことも可能です:

select a.id, a.crd, a.stn, a.sum_amt, b.sum_amt, 
    coalesce(a.sum_amt, 0) - coalesce(b.sum_amt, 0) as diff 
from (
    select id, crd, stn, type, sum(amt) as sum_amt 
    from table_a 
    group by id, crd, stn, type 
) a 
left outer join (
    select id, crd, stn, type, sum(amt) as sum_amt 
    from table_b 
    group by id, crd, stn, type 
) b 
on b.id = a.id and b.crd = a.crd and b.stn = a.stn and b.type != a.type 
order by a.id, a.crd, a.stn; 

     ID  CRD  STN SUM_AMT SUM_AMT  DIFF 
---------- ---------- ---------- ---------- ---------- ---------- 
    7123344  556677  442233  66000  67000  -1000 
    7132323  992211  556611  21500  20000  1500 
    7178866  223344  989898  35200     35200 

またはテーブルAまたはテーブルBのいずれか、または両方に表示される組み合わせのために:

select coalesce(a.id, b.id) as id, coalesce(a.crd, b.crd) as crd, 
    coalesce(a.stn, b.stn) as stn, a.sum_amt, b.sum_amt, 
    coalesce(a.sum_amt, 0) - coalesce(b.sum_amt, 0) as diff 
from (
    select id, crd, stn, type, sum(amt) as sum_amt 
    from table_a 
    group by id, crd, stn, type 
) a 
full outer join (
    select id, crd, stn, type, sum(amt) as sum_amt 
    from table_b 
    group by id, crd, stn, type 
) b 
on b.id = a.id and b.crd = a.crd and b.stn = a.stn and b.type != a.type 
order by coalesce(a.id, b.id), coalesce(a.crd, b.crd), coalesce(a.stn, b.stn); 

     ID  CRD  STN SUM_AMT SUM_AMT  DIFF 
---------- ---------- ---------- ---------- ---------- ---------- 
    7123344  556677  442233  66000  67000  -1000 
    7132323  992211  556611  21500  20000  1500 
    7178866  223344  989898  35200     35200 
    7199933  667733  343433     67100  -67100 

これらは、左または完全な外部結合を使用し、coalesce()呼び出しを追加して、1つのインラインビューまたは他のインラインビューに存在しないデータを処理します。

ご変更されたデータで

、そしてあなたが望む記号を取得するための計算を逆に、これはあなたが期待される結果を取得します。

with table_a (AMT, ID, CRD, STN, TYPE) as (
      select 22000, 7123344, 556677, 442233, 0200 from dual 
    union all select 22000, 7123344, 556677, 442233, 0200 from dual 
    union all select 22000, 7123344, 556677, 442233, 0200 from dual 
    union all select 11500, 7132323, 992211, 556611, 0200 from dual 
    union all select 10000, 7132323, 992211, 556611, 0200 from dual 
    union all select 35200, 7199933, 223344, 989898, 0200 from dual 
), 
table_b (AMT, ID, CRD, STN, TYPE) as (
      select 67000, 7123344, 556677, 442233, 0220 from dual 
    union all select 20000, 7132323, 992211, 556611, 0220 from dual 
    union all select 35300, 7199933, 223344, 989898, 0220 from dual 
) 
select a.id, a.crd, a.stn, a.sum_amt, b.sum_amt, b.sum_amt - a.sum_amt as diff 
from (
    select id, crd, stn, type, sum(amt) as sum_amt 
    from table_a 
    group by id, crd, stn, type 
) a 
inner join (
    select id, crd, stn, type, sum(amt) as sum_amt 
    from table_b 
    group by id, crd, stn, type 
) b 
on b.id = a.id and b.crd = a.crd and b.stn = a.stn and b.type != a.type 
order by a.id, a.crd, a.stn; 

     ID  CRD  STN SUM_AMT SUM_AMT  DIFF 
---------- ---------- ---------- ---------- ---------- ---------- 
    7123344  556677  442233  66000  67000  1000 
    7132323  992211  556611  21500  20000  -1500 
    7199933  223344  989898  35200  35300  100 
関連する問題