比较 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
计算 CR
和 DB
的总和并比较它们
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
我有一个要求,其中有两个主要字段 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
计算 CR
和 DB
的总和并比较它们
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