我有一个交易表,偶尔会有重复的条目。如果/当管理员找到这些重复项时,它们将撤消交易,因此产生负值(但由于法规要求,原始重复项仍然存在)。我想创建一个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
理想情况下,如果我在上表中运行“所需”查询,则会收到以下结果:
交易日期 ; 交易数量; 交易价值; 数数
2/15/08 ; 18 ; 95.00 ; 2 3/1/08 ; 11 ; 54.00 ; 3
那有意义吗?我已经想出了如何编写查询来给我一些重复记录的方法,但是我无法弄清楚如何排除已经被“撤消”的重复记录。任何帮助将不胜感激!
怎么样:
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