【问题标题】:SQL - Need to find duplicate records but EXCLUDE reversed transactionsSQL - 需要查找重复记录但排除反向交易
【发布时间】:2008-11-19 14:27:55
【问题描述】:

我有一张交易表,偶尔会有 重复条目。如果/当管理员发现这些重复条目时,他们将撤消交易,从而产生负值(但由于监管要求,原始副本仍然存在)。我想创建一个 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

这有意义吗?我已经想好怎么写了 查询给我一个重复的计数,但我不知道如何 排除已经“退出”的重复记录。 任何帮助将不胜感激!

【问题讨论】:

  • 您是否还需要处理部分反转?

标签: sql crystal-reports report reporting


【解决方案1】:

怎么样:

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

【讨论】:

  • 感谢您对我的帖子的评论;我的查询已被取消,我已将其删除。干杯
  • 哇,这正是我所需要的......它工作得很好!非常感谢你让我免于头痛。这么快就想出那个解决方案,你一定很厉害。再次感谢!
  • 看起来不错。除非逆转有错误(没有正确的数量和价值),否则应该解决问题。
  • 谢谢。关于乔纳森的观点:非常正确。我曾在这样的系统上工作过,其中 reveral 记录有一个 reversed_transaction_id 列,以便您可以将原始记录与相应的撤销配对。
猜你喜欢
  • 2019-06-02
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多