2008-11-19 92 views
4

我有一個交易表,它偶爾會有 重複的條目。如果/當管理員發現這些重複條目時,他們將顛倒交易,因此創建一個負值(但由於監管要求,原始副本仍然存在)。我想創建一個SQL查詢(並使用Crystal Reports)爲管理員創建一個報告,以輕鬆找到重複的事務。由於大量的交易,我想通過忽視他們已經扭轉的交易來讓他們更容易。SQL - 需要查找重複記錄但EXCLUDE顛倒了交易

這裏是想我做的一個例子:

交易日期;交易數量;交易價值;逆轉

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

感謝您對我的文章發表評論;我的查詢很順利,我已經刪除它。乾杯 – 2008-11-19 14:56:55