Oracle减号 - 从值列表中,我如何仅计算非反转值

时间:2009-07-24 18:29:01

标签: sql oracle

我在表格中列出了付款交易。这包括付款逆转。付款撤销没有被标记,所以我必须推断,如果扣除等于现有交易,则是逆转

我只想要计算未被撤销的交易。

E.g来自交易金额列表。

5 五 -5(这是一个5交易的逆转,因此一个5交易仍然有效) 10 -10(对于10个交易,这是逆转,因此没有10个交易有效) 15 15 15 -15(这是15个交易的逆转,所以两个15交易有效) 20

我想要一个

列表

5 15 15 20

即我有四笔未被撤销的交易。

这是一些测试代码,我的尝试没有用。

CREATE TABLE check_minus
(
name_id NUMBER(4),
trans NUMBER(4),
val NUMBER(2)
);

insert into  check_minus values (1,1,5);
insert into  check_minus values (1,2,5);
insert into  check_minus values (1,3,-5);
insert into  check_minus values (1,4,10);
insert into  check_minus values (1,5,-10);
insert into  check_minus values (1,6,15);
insert into  check_minus values (1,7,15);
insert into  check_minus values (1,8,15);
insert into  check_minus values (1,9,-15);
insert into  check_minus values (1,10,20);
commit;

-- using  not in
select name_id, val from check_minus
    where val > 0  -- positive transactions
    and (name_id, val) not in 
    (
    select name_id, abs(val) val from check_minus
    where val < 0 -- negative transactions
    );

-- using  minus
select name_id, val from check_minus
    where val > 0  -- positive transactions
 minus 
select name_id, abs(val) from check_minus
    where val < 0  -- negative transactions

1 个答案:

答案 0 :(得分:3)

减号操作使用不同的集合。试试这个:

select row_number() over (partition by name_id, val order by name_id, val), name_id, val 
from check_minus
where val > 0
  minus
select row_number() over (partition by name_id, val order by name_id, val), name_id, abs(val) 
from check_minus
where val < 0

它产生:

RowNum Name_Id   Val
1,     1,        20
2,     1,        5
2,     1,        15
3,     1,        15