2008-11-19 2 views
4

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

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

Transaction Дата; Количество транзакций; Стоимость транзакции; Реверсирование

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 

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

Дата транзакции; Количество транзакций; Стоимость транзакции; Подсчет

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

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

+0

Вы будете нуждаться, чтобы справиться с частичным развороты, а? – 2008-11-19 14:38:34

ответ

4

Как насчет:

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 
+0

Спасибо за ваш комментарий к моему сообщению; мой запрос был удален, и я удалил его. Cheers – 2008-11-19 14:56:55

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