我在下面有一个表transactions
:
| id | type | transaction |
| 1 | A | 100 |
| 2 | B | -500 |
| 3 | A | 300 |
| 4 | A | 400 |
| 5 | A | 500 |
| 6 | B | -300 |
| 7 | B | -100 |
| 8 | A | 100 |
| 9 | B | -100 |
| 10 | A | 100 |
| 11 | B | -100 |
| 12 | A | 100 |
基本上对于每种类型的A
交易,transaction
金额都是正数,对于每种类型B
交易,transaction
金额将为负数。 (B是A的逆转交易)。
编写sql select语句以过滤掉所有事务及其否定事务的最佳方法是什么,并且只留下未反转的事务。 e.g。
| id | type | transaction |
| 4 | A | 400 |
| 12 | A | 100 |
PS。如果没有B
,则不会有任何A
类型的交易。
答案 0 :(得分:1)
如果有1-1对应关系,那么not exists
效果很好:
select t.*
from transactions t
where not exists (select 1
from transaction t2
where t2.type <> t.type and t2.transaction = - t.transaction
);
当一个事务可以具有多个相同的金额时,这特别失败。为此,我可能会建议聚合:
select amount, sum(type = 'A') as num_as, sum(type = 'B') as num_bs
from transactions t
group by abs(amount)
having sum(amount) <> 0;
这不返回原始行,但它确实显示了不对齐的位置。