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

Posted

技术标签:

【中文标题】比较 Oracle SQL 中的两个不同字段【英文标题】:Compare Two Different Fields In Oracle SQL 【发布时间】:2021-04-07 13:40:13 【问题描述】:

我有一个需求,其中我有两个主要字段 Amount CR 和 Amount DR。 现在的要求是这两个金额具有不同的值,例如 Trx 编号、银行名称 ETC,但具有共同的参考编号。 每个Refrence Number只有一条记录,分别有CR Amount,DR Amount。

详情见下表:

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 查询实现这一点?

【问题讨论】:

我不确定我是否理解您想要返回的内容。您是否要返回 2 行,每个参考号一个,其中包含 CR 和 DR 金额?您是否要返回第 1 行和第 2 行,因为它们匹配? 3 & 4 因为他们不匹配?还有什么?每个参考号是否总是正好有 1 个 CR 和 1 个 DR 金额?或者您可以 CR 一家银行和 DR 两家银行(反之亦然)? 我只想显示那些 cr 和 dr 金额不同但参考编号相同的行,例如参考编号 1111 具有不同的 cr 和 dr 金额,所以我想显示交易 3 和4 但我不知道如何实现。是的,参考编号只有一个 cr 和 dr 金额,但有不同的交易编号。对于银行,它可能是同一家银行,也可能是不同的。 【参考方案1】:

知道只有一条记录为 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 

【讨论】:

【参考方案2】:

添加两个分析聚合函数,计算每个 reference_numberCRDB 的总和并比较它们

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           

【讨论】:

【参考方案3】:

您可以聚合并使用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;

【讨论】:

以上是关于比较 Oracle SQL 中的两个不同字段的主要内容,如果未能解决你的问题,请参考以下文章

Oracle两个日期类型字段怎么比较大小

Oracle两个日期类型字段怎么比较大小

sql比对两个表中的差异数据比较的sql语句

如何对比两个相同数据库表的不同

如何将两个不同数据库(MySQL、SQL SERVER)之间的 TEXT 字段与哈希值进行比较?

oracle字段为''或者NULL时做比较