【问题标题】:Exclude Debit Transactions排除借记交易
【发布时间】:2016-09-13 11:06:03
【问题描述】:

我需要从交易表中选择记录,不包括某些交易。

下面是我的表格的示例输出。

TB_ACCOUNTS     
CUSTCD  ACCTNO  PRDCD
100     10001   SATF
100     10002   SATF
200     10003   CUS

TB_TRANSACTIONS    
TXNNO   TXDATE      ACCTNO  CUSTOMER_NO TXAMT   CASHFLOWTYPE
TX1     18-Jul-16   10001   100         5000    CR
TX2     18-Jul-16   10002   100         5000    DR
TX3     18-Jul-16   10003   200         3000    DR
TX4     18-Jul-16   10001   100         3000    CR

我想选择 PRDCD 为“SATF”的信用交易,并排除自己账户之间的转账。例如客户 100 PRDCD 是 SATF 并且有两个帐户。我希望我的选择查询排除金额为 5000 的信用交易,因为借记账户也属于同一客户。但包括 3000 金额的贷方交易,因为借方账户属于不同的客户且类型不是 SATF。

到目前为止,我得到了以下查询,但我得到的输出完全错误。

select * from TB_TRANSACTIONS AB inner join TB_ACCOUNTS AC
on AB.ACCTNO=AC.ACCTNO
where AB.CASHFLOWTYPE='CR'
and AC.PRDCD='SATF'
and AB.TXNNO=
(select TXNNO from TB_TRANSACTIONS A, TB_ACCOUNTS B
where A.ACCTNO=B.ACCTNO
and A.TXAMT=AB.TXAMT
and A.CASHFLOWTYPE='DR'
and B.PRDCD=AC.PRDCD)

如何达到预期的效果?

【问题讨论】:

  • 如果在您的示例中交易编号为 TX1、TX1、TX2、TX2,那就很简单了。否则我们怎么知道前两行属于同一个事务,接下来的两行属于第二个事务?使用txamt 连接行似乎很可疑。
  • 有没有办法将给定的 CR trx 与其对应的 DR trx 关联起来?
  • @Ponder Stibbons:TXNNO 不是重复的,它有一个唯一的编号,这也是我纠结的地方
  • @Ricardo Arnold:我发现唯一可能的方法是通过金额,否则无法直接关联 DR 和 CR

标签: oracle


【解决方案1】:

你可以在这里使用类似的东西:

select txnno, txdate, acctno, customer_no, txamt, cashflowtype, prdcd
  from (
    select t.*, a.prdcd,
           count(distinct customer_no) over (partition by txdate, txamt) cnt
      from tb_transactions t join tb_accounts a on t.acctno = a.acctno )
  where cnt = 2 and cashflowtype = 'CR' and prdcd = 'SATF'

这里我假设txamt 对于每个日期都是唯一的。我强烈怀疑这可能是错误的假设,因此请注意。 但是除了这一列告诉我们两行属于同一个操作之外,没有其他内容。

在第一个查询中,我在分析版本中使用了count()。还有其他可能的解决方案,例如(not) exists:

select *
  from tb_transactions t join tb_accounts a on t.acctno = a.acctno 
  where 
    not exists (
      select 1 from tb_transactions tt join tb_accounts ta on tt.acctno = ta.acctno
        where tt.txdate = t.txdate and tt.txamt = t.txamt
          and tt.cashflowtype = 'DR' and tt.customer_no = t.customer_no)
    and cashflowtype = 'CR' and prdcd = 'SATF'

(如有语言错误,请见谅)

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 2012-07-22
    • 2013-01-21
    • 2015-10-13
    • 2016-06-16
    • 2019-07-12
    • 2014-11-19
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多