首页 > 解决方案 > 删除反转对 - ms 访问 SQL

问题描述

我的问题与Remove reversal pairs using SQL类似,但不同。情况如下。数据(没有错别字。两行与 X1 相关,并且反转确实具有相同的 REF):

ROW      |    REF     |    Amount |    Comment      |
1        | 00001      |    1000   | Relates to X1   |
2        | 00002      |     500   | Relates to X1   |
3        | 00003      |     100   | Relates to X2   |
4        | 00004      |    1000   | Relates to X3   |
5        | 00004      |   -1000   | Reverses 00004  |
6        | 00005      |     250   | Relates to X3   |

期望的结果

ROW      |   Agg_Amt |    Comment      |
1        |    1500   |      X1         |
2        |     100   |      X2         |
3        |     250   |      X3         |

问题:

以下成功删除了反转但丢失了重要信息

SELECT REF, SUM(Amount) FROM T1 GROUP BY REF

以下为 X3 生成 2 行,1 为 1250,1 为 -1000

SELECT REF, Comment, SUM(Amount) FROM T1 GROUP BY REF, Comment

我尝试的任何其他解决方案都会导致上述两个问题之一,因此分享毫无意义。

我已经使用 解决了这个问题WHERE REF NOT IN ,但至少可以说性能是次优的。

编辑

完整代码:

SELECT Comment, SUM(Amount)
FROM T1
WHERE REF NOT IN(
     SELECT DISTINCT REF 
     FROM T1
     WHERE Comment Like "Reverses*")
GROUP BY Comment

作为 MS-Access,我不能使用临时表。

问题

有没有一个优雅的解决方案,最好没有太多的包装和嵌套?我知道我可能在这里遗漏了一些简单的东西。

谢谢!

标签: sqlms-access

解决方案


如果我理解正确,这可能会做你想要的:

select t1.comment, sum(amount)
from t1
where not exists (select 1
                  from t1 as tt1
                  where tt1.ref = t1.ref and
                        tt1.amount = - t1.amount and
                        (t1.comment like "Reverses*" or
                         tt1.comment like "Reverses*"
                        )
                 )
group by t1.comment;

推荐阅读