あなたのサンプル出力は、実際のテーブルのデータと一致していません;私達はちょうど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
それがで参加して、グループをやって、かなり基本的なクエリになりますこれを達成する。多くのSQLを書いたことがありますか? – slambeth
あなたが試したことと、それがうまくいかない理由を実際に表示する必要があります。なぜ3番目の違いが100であるのですか - それはIDですか?そして、どちらか一方のテーブルだけにあるデータに違いが必要ですか?違いの絶対値は(あなたの例では、最初の2つのうちの1つは正でもう1つは負です)? –
訂正しました。よろしく、 –