2017-02-07 12 views
0

私は2つのテーブルTABLE1とTABLE2を持っています。それぞれの特定の日の現金レジ建物。各テーブルは、その日の特定の時刻に撮影されたデータスナップショットです。Oracle:2つのテーブル間のカラム間の値を比較する他のカラムの値を考慮に入れて

同じ日付の同じ建物の同じキャッシュレジスタに請求額の差(請求額差)がある行だけを一覧にしたいとします。現金帳簿IDは、それが含まれているビルディングに対してのみ一意です。

この目的は、同じ日の後のスナップショット(TABLE2)中に、どのビルディングのどのレジスターが異なる請求額を含んでいるかを調べることです。

TABLE1とTABLE2の両方のデータ構造は次のとおりです。

Column Type Comment 
ID NUMBER(10,0) -- Serial 
DAY DATE(7) -- The date 
BUILDING_ID NUMBER(10,0) -- The ID of the building 
REGISTER_ID NUMBER(10,0) -- The ID of the cash register (unique per building ID) 
BILL5 NUMBER(10,0) -- The number of 5 dollar bills 
BILL10 NUMBER(10,0) -- The number of 10 dollar bills 
BILL20 NUMBER(10,0) -- The number of 20 dollar bills 
BILL50 NUMBER(10,0) -- The number of 50 dollar bills 
+2

あなたの質問を編集し、サンプルデータと希望する結果を提供してください。 –

答えて

2
SELECT * 
FROM table1 t1 
JOIN table2 t2 
    -- Use these critieria to match rows from t1 with rows from t2 
    ON (t1.building_id = t2.building_id 
    AND t1.register_id = t2.register_id 
    AND t1.day = t2.day) 
-- Return only rows where the amount of bills in t1 and t2 is different 
WHERE t1.bill5 <> t2.bill5 
     OR t1.bill10 <> t2.bill10 
     OR t1.bill20 <> t2.bill20 
     OR t1.bill50 <> t2.bill50 
1

あなたはこのような何かを試すことができます。各テーブルは一度だけスキャンされ、結合はありません。両方のテーブルから選択し、「ソース」の列を追加します。 1日ごとにbuilding_idとregister_idと請求数を計算し、カウントが1のグループのみを保持します。請求額が同じ場合、グループ内の行数は2になるため、行は返されません。請求額が異なる場合、行はグループ化されません。それぞれの行数は1になり、返されます。これらの行(正確に1行のグループ)では、SELECTのMAX()は効果がありません(ただし、GROUP BYクエリであるため、まだ必要です)。

select max(source) as source, day, building_id, register_id, bill5, bill20, bill50 
from  (
      select 'table1' as source, day, building_id, register_id, bill5, bill20, bill50 
      from table1 
      union all 
      select 'table2' as source, day, building_id, register_id, bill5, bill20, bill50 
      from table2 
     ) 
group by day, building_id, register_id, bill5, bill20, bill50 
having count(*) = 1 
order by day, building_id, register_id, source 
; 
+0

このクエリは、2つのテーブルのいずれかにのみ存在するすべてのレコードを取得します。 –

+0

@ThorstenKettner - oops、請求数はGROUP BYにも含まれている必要があります。私は修正をするために編集します、それを指摘していただきありがとうございます! – mathguy

関連する問題