回答

收藏

SQL-需要查找重复记录,但排除反向事务

技术问答 技术问答 334 人阅读 | 0 人回复 | 2023-09-12

我有一个交易表,偶尔会有重复的项目。如果/当管理员发现这些重复项目时,它们将被取消,从而产生负值(但由于法律法规的要求,原始重复项目仍然存在)。我想创建一个SQL查询(并使用)Crystal8 p" _+ Z7 B* N7 R& O* g; A9 c
Reports)为管理员提供报告,轻松找到重复的交易。由于交易量大,我想通过忽略已撤销的交易来让他们更容易。
1 m. d4 d; }0 I5 V3 C+ d这是我想做的事情的例子:
, g, Z& X5 S7 O& b  b+ G  w7 j交易日期; 交易量; 交易价值; 逆转+ ~1 U' \9 W8 u: s; |6 A1 u
1/1/08   ; 14   .  N1/1/08   ; 14   .  N1/1/08    -    -70.00   ; Y2/1/08   ; 17   .  N2/15/08  ; 18   .  N2/15/08  ; 18   .  N3/1/08   ; 11   .  N3/1/08    -11   -54.00   ; Y3/1/08   ; 11   .  N3/1/08   ; 11   .  N3/1/08   ; 11   .  N理想情况下,如果我在上表中运行需要查询,我会收到以下结果:
4 ]; \4 i4 R2 c9 ^; C5 w交易日期; 交易量; 交易价值; 数
2 [/ R- `' i' X1 S/ |* }2/15/08   ; 18   .  /1/08     .  3那有意义吗?我已经想出了如何编写查询来给我一些重复记录的方法,但是我无法弄清楚如何排除已经被“撤消”的重复记录。任何帮助将不胜感激!
: D+ u% U0 F0 ^: _# m. k                                                                6 c- i8 `8 U/ l5 g# p, F7 J* J
    解决方案:                                                               
! s! @% R% j* h$ X                                                                怎么样:7 T+ I; v  e/ C5 M5 J: G6 L  S
select dt,abs(qty),abs(val),      sum(case when reversal='Y' then -1 else 1 end) as countfrom transactionsgroup by dt,abs(qty),abs(val)having sum(case when reversal='Y' then -1 else 1 end) > 1;我刚刚在Oracle测试后,可正常工作:
' M2 `. ~2 q  B; D7 E4 P8 jcreate table transactions( dt date,qty number,val number,reversal varchar2(1));insert into transactions values (to_datemm/dd/yy14     . N');insert into transactions values (to_datemm/dd/yy14     . N');insert into transactions values (to_datemm/dd/yy -14   -70.00   ,'Y');insert into transactions values (to_date(2/1/08,'mm/dd/yy    ,17   . N');insert into transactions values (to_datemm/dd/yy18     . N');insert into transactions values (to_datemm/dd/yy18     . N');insert into transactions values (to_date(3/1/08,mm/dd/yy    ,11   . 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   . N');insert into transactions values (to_date(3/1/08,mm/dd/yy    ,11   . N');insert into transactions values (to_date(3/1/08,mm/dd/yy    ,11   . 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年                              20101201201    -MAR-2008年
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则