给定一些类似于以下临时表中的行:
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.79and15.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 中的所有AccountDocumentLineIds 并查看哪一行与余额匹配,但这只会处理第一个示例(只剩下一行),而不是需要保留两行的第二个示例(所以不容易拆分一个值来给出两行)遍历一组
AccountDocumentLineIds 中的每个条目,如果找到匹配项,则删除两个对应项;我认为这个会起作用,尽管不确定如何在 SQL 中进行操作?
更新:根据Bulat 的回答添加了完整的答案。