我需要从交易表中选择记录,不包括某些交易。
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)
如何达到预期效果?
答案 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'
(对不起任何语言错误)