SQL - нужно найти повторяющиеся записи, но ИСКЛЮЧИТЬ обращенные транзакции - PullRequest
4 голосов
/ 19 ноября 2008

У меня есть таблица транзакций, которая иногда будет иметь повторяющиеся записи. Если / когда администратор обнаружит эти дубликаты записей, они будут сторнировать транзакции, создавая, таким образом, отрицательное значение (но исходный дубликат все еще остается из-за нормативных требований). Я хотел бы создать запрос SQL (и использовать Crystal Reports), чтобы администраторы могли легко находить дубликаты транзакций. Из-за большого количества транзакций я хотел бы упростить их, игнорируя транзакции, которые они уже отменили.

Вот пример того, что я хотел бы сделать:

Дата транзакции; Транзакция Кол-во; Стоимость сделки; Реверсирование

1/1/08    ; 14    ;    70.00    ; N
1/1/08    ; 14    ;    70.00    ; N
1/1/08    ; -14   ;    -70.00   ; Y
2/1/08    ; 17    ;    89.00    ; N
2/15/08   ; 18    ;    95.00    ; N
2/15/08   ; 18    ;    95.00    ; N
3/1/08    ; 11    ;    54.00    ; N
3/1/08    ; -11   ;    -54.00   ; Y
3/1/08    ; 11    ;    54.00    ; N
3/1/08    ; 11    ;    54.00    ; N
3/1/08    ; 11    ;    54.00    ; N

В идеале, если бы я выполнил свой "желаемый" запрос в таблице выше, я бы получить следующий результат:

Дата транзакции; Транзакция Кол-во; Стоимость сделки; Count

2/15/08    ; 18    ;    95.00    ; 2
3/1/08     ; 11    ;    54.00    ; 3

Имеет ли это смысл? Я уже понял, как написать запрос, чтобы дать мне количество дубликатов, но я не могу понять, как исключить дубликаты записей, которые уже были "отменены". Любая помощь будет принята с благодарностью!

1 Ответ

4 голосов
/ 19 ноября 2008

Как насчет:

select dt, abs(qty), abs(val),
       sum(case when reversal='Y' then -1 else 1 end) as count
from transactions
group by dt, abs(qty), abs(val)
having sum(case when reversal='Y' then -1 else 1 end) > 1;

Я только что проверил его в Oracle, и он работает:

create table transactions
( dt date
, qty number
, val number
, reversal varchar2(1)
);

insert into transactions values (to_date('1/1/08','mm/dd/yy')    , 14    ,    70.00    , 'N');
insert into transactions values (to_date('1/1/08','mm/dd/yy')    , 14    ,    70.00    , 'N');
insert into transactions values (to_date('1/1/08','mm/dd/yy')    , -14   ,    -70.00   , 'Y');
insert into transactions values (to_date('2/1/08','mm/dd/yy')    , 17    ,    89.00    , 'N');
insert into transactions values (to_date('2/15/08','mm/dd/yy')   , 18    ,    95.00    , 'N');
insert into transactions values (to_date('2/15/08','mm/dd/yy')   , 18    ,    95.00    , 'N');
insert into transactions values (to_date('3/1/08','mm/dd/yy')    , 11    ,    54.00    , 'N');
insert into transactions values (to_date('3/1/08','mm/dd/yy')    , -11   ,    -54.00   , 'Y');
insert into transactions values (to_date('3/1/08','mm/dd/yy')    , 11    ,    54.00    , 'N');
insert into transactions values (to_date('3/1/08','mm/dd/yy')    , 11    ,    54.00    , 'N');
insert into transactions values (to_date('3/1/08','mm/dd/yy')    , 11    ,    54.00    , 'N');

SQL> select dt, abs(qty), abs(val),
  2         sum(case when reversal='Y' then -1 else 1 end) as count
  3  from transactions
  4  group by dt, abs(qty), abs(val)
  5  having sum(case when reversal='Y' then -1 else 1 end) > 1;

DT            ABS(QTY)   ABS(VAL)      COUNT
----------- ---------- ---------- ----------
15-FEB-2008         18         95          2
01-MAR-2008         11         54          3
...