排除借记交易

时间:2016-09-13 11:06:04

标签: oracle

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

Bellow是我表格的示例输出。

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)

如何达到预期效果?

1 个答案:

答案 0 :(得分: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'

(对不起任何语言错误)