给定一些类似于以下临时表中的行:
TransactionId | AccountsDocumentLineId | Amount
------------- ---------------------- ------
52345 12345 -15.79
52346 12345 15.79
52347 12345 -15.79
52348 22222 -6.34
52349 22222 6.34
52350 22222 6.34
52351 22222 -6.34
52352 22222 -8.76
52353 22222 10.49
如何确保删除任何相互抵消(总和为零)的行 AccountsDocumentLineId
,并且只留下那些没有更多匹配行可以配对的行?
因此,在上面的示例中,带有TransactionId
= 52345
(或 52347
) 的行将被保留(因为-15.79
and15.79
会相互抵消)。
类似地,带有TransactionId
=52352
和的52353
行将保留(因为两对-6.34
和6.34
将相互抵消)。
因此,我们将得到以下最终结果:
TransactionId | AccountsDocumentLineId | Amount
------------- ---------------------- ------
52347 12345 -15.79
52352 22222 -8.76
52353 22222 10.49
注意:我已经删除了所有不必要的细节(更多的列和更多的行)来简单地展示手头的问题。
我玩过的一些选项是: -
总结
Amount
一组 s 中的所有AccountDocumentLineId
s 并查看哪一行与余额匹配,但这只会处理第一个示例(只剩下一行),而不是需要保留两行的第二个示例(所以不容易拆分一个值来给出两行)遍历一组
AccountDocumentLineId
s 中的每个条目,如果找到匹配项,则删除两个对应项;我认为这个会起作用,尽管不确定如何在 SQL 中进行操作?
更新:根据Bulat 的回答添加了完整的答案。