按行划分的SQL组按字段

时间:2018-06-11 14:56:16

标签: mysql sql

我在下面有一个表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类型的交易。

1 个答案:

答案 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;

这不返回原始行,但它确实显示了不对齐的位置。