2009-07-24 5 views
1

J'ai une liste de transactions de paiement dans une table. Cela inclut les inversions de paiement. Les inversions de paiement ne sont pas marquées, donc je dois déduire que si une déduction est égale à une transaction existante, il s'agit d'une annulationOracle Minus - À partir d'une liste de valeurs, comment compter uniquement les valeurs non inversées?

Je veux un décompte des transactions qui n'ont pas été annulées.

E.g D'après une liste de montants de transactions.

-5 (ceci est une inversion pour une 5 transaction, si une 5 transaction est toujours valide) -10 (Ceci est reprise pour une 10 transaction, donc pas de 10 transactions valides) -15 (C'est reprise pour une transaction 15, donc deux 15 opérations sont valides)

Je veux une liste qui est

i.e J'ai eu quatre transactions qui n'ont pas été annulées.

Voici un code de test, ma tentative n'a pas fonctionné.

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 

Répondre

3

Les opérations minus utilisent des ensembles distincts. Essayez ceci:

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 

Il produit:

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

Merci, ça a très bien fonctionné, – Reuben

Questions connexes