我有一张交易表,偶尔会有
重复条目。如果/当管理员发现这些重复条目时,他们将撤销交易,因此创建一个负值(但由于监管要求,原始副本仍然存在)。我想创建一个 SQL 查询(并使用 Crystal Reports)来为管理员制作一份报告,以便轻松找到重复的交易。由于交易量很大,我想通过忽略他们已经撤销的交易来让他们更容易。
这是我想做的一个例子:
交易日期 ;交易数量;交易值(value);反转
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
理想情况下,如果我在上面的表格上运行我的“期望”查询,我会
收到以下结果:
交易日期 ;交易数量;交易值(value);计数
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
关于SQL - 需要查找重复记录但排除反向事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/302022/