比较 Oracle 中的两个不同字段 SQL

Compare Two Different Fields In Oracle SQL

我有一个要求,其中有两个主要字段 Amount CR 和 Amount DR。 现在的要求是这两个金额具有不同的值,例如 Trx Number、Bank Name ETC,但具有共同的 Reference Number。 每个Refrence Number只有一条记录,分别有CR Amount, DR Amount.

有关详细信息,请参阅下面的 table:

Transaction Number Bank Name Reference Number CR Amount DR Amount
1 XYZ 1234 1000
2 ABC 1234 1000
3 DEF 1111 1000
4 TEST 1111 2300

所以基本上我想根据参考编号比较 CR 和 DR 金额。在示例中,参考号 1234 可以,参考号 1111 应该列出。

如何通过 Oracle 查询实现此目的?

您可以汇总并使用 case 表达式:

select reference_number,
       sum(cr_amount), sum(db_amount),
       (case when sum(cr_amount) = sum(db_amount)
             then 'same' else 'different'
        end)
from t
group by reference_number;

知道只有一条记录有 dr 和一条有 cr 金额,您可以对参考号进行自连接。 一个参考号的 2 笔交易将列在一行中:

select * from table t1 
 inner join table t2 on t1.referencenumber = t2.referencenumber 
                   and t1.cr_amount is not null
                   and t2.dr_amount is not null
where t1.cr_amount <> t2.dr_amount 

添加两个分析聚合函数,根据 reference_number 计算 CRDB 的总和并比较它们

case when
sum(cr_amount) over (partition by reference_number) =
sum(dr_amount) over (partition by reference_number) then 'Y' else 'N' end is_equ

这标识具有 reference_number 的行,其中总和 不等于

在一个额外的查询中,简单过滤仅不等于总和的行。

with test as (
select a.*,
case when 
sum(cr_amount) over (partition by reference_number) =
sum(dr_amount) over (partition by reference_number) then 'Y' else 'N' end is_equ
from tab a)
select 
  TRANSACTION_NUMBER, BANK_NAME, REFERENCE_NUMBER, CR_AMOUNT, DR_AMOUNT
from test 
where is_equ = 'N'

TRANSACTION_NUMBER BANK REFERENCE_NUMBER  CR_AMOUNT  DR_AMOUNT
------------------ ---- ---------------- ---------- ----------
                 3 DEF              1111                  1000
                 4 TEST             1111       2300