2017-02-07 1 views
0

У меня есть две таблицы, ТАБЛИЦА 1 и ТАБЛИЦА2, каждая из которых содержит общую сумму наличных денег в кассовом аппарате за данный день в данном здание. Каждая таблица представляет собой снимок данных, сделанный в определенное время в течение дня.Oracle: сравнить значения между столбцами между двумя таблицами, принимая во внимание значения других столбцов

Я хочу перечислить только строки, на которых есть разница в размере векселей (разница в счете) в том же кассовом аппарате для того же здания на ту же дату. Идентификаторы кассовых аппаратов уникальны только для здания, в котором они содержатся.

Цель состоит в том, чтобы узнать, какие кассовые аппараты, в которых здания содержали другое количество счетов в течение более позднего моментального снимка (ТАБЛИЦА 2) за тот же день.

Структура данных как 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

Вы можете попробовать что-то вроде этого. Каждая таблица сканируется только один раз, и нет объединений. Выберите из обеих таблиц и добавьте столбец для «source»; group by day, building_id и register_id, а счетчик счетов - и сохраняют только группы, для которых счетчик равен 1. Если счетчик счетов идентичен, подсчет строк внутри группы будет равен 2, поэтому строки не будут возвращены; но если счет счета отличается, строки не будут сгруппированы; количество строк для каждого будет равно 1, и они будут возвращены. Для этих строк (группы с ровно 1 строкой) MAX() в SELECT не имеет эффекта (но это все еще необходимо, так как это запрос 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

Этот запрос получает только все записи, которые присутствуют только в одной из двух таблиц. –

+0

@ThorstenKettner - oops, счет счета также должен быть в GROUP BY. Я отредактирую, чтобы внести исправления, спасибо, что указали! – mathguy

Смежные вопросы