SQL Server中如何对互逆借贷账户交易进行合并分组?
解决方案:合并互逆交易并计算净额
要实现将A↔C这类互逆交易合并为一组并计算净额的需求,核心思路是标准化交易的账号对,把方向相反的交易归到同一组,再通过金额正负调整来计算净额。以下是针对SQL Server的实现方案:
实现代码
WITH StandardizedTransactions AS ( SELECT -- 标准化账号对:按字典序排序,统一分组依据 CASE WHEN DebitAccountNumber < CredtiAccountNumber THEN DebitAccountNumber ELSE CredtiAccountNumber END AS MainAccount, CASE WHEN DebitAccountNumber < CredtiAccountNumber THEN CredtiAccountNumber ELSE DebitAccountNumber END AS SecondaryAccount, -- 根据交易方向调整金额:正向交易加金额,反向交易减金额 CASE WHEN DebitAccountNumber < CredtiAccountNumber THEN Amount ELSE -Amount END AS AdjustedAmount FROM TestTable ) SELECT -- 根据净额正负确定最终的借贷方向 CASE WHEN SUM(AdjustedAmount) >= 0 THEN MainAccount ELSE SecondaryAccount END AS DebitAccountNumber, CASE WHEN SUM(AdjustedAmount) >= 0 THEN SecondaryAccount ELSE MainAccount END AS CredtiAccountNumber, ABS(SUM(AdjustedAmount)) AS NetAmount FROM StandardizedTransactions GROUP BY MainAccount, SecondaryAccount -- 可选:过滤掉净额为0的交易对 HAVING ABS(SUM(AdjustedAmount)) > 0;
代码逻辑说明
标准化账号对:
通过CASE语句将每笔交易的借贷账号按字典序排序,生成MainAccount和SecondaryAccount。这样A→C和C→A都会被归为(A, C)这同一个分组。调整金额方向:
对于正向交易(MainAccount→SecondaryAccount),金额保持正数;对于反向交易(SecondaryAccount→MainAccount),金额转为负数。这样分组求和时就能自动计算出两组交易的净额。确定最终显示方向:
根据净额的正负判断哪一方是最终的借方/贷方:- 若净额为正,说明
MainAccount向SecondaryAccount的总转出更多,显示MainAccount→SecondaryAccount; - 若净额为负,说明
SecondaryAccount向MainAccount的总转出更多,显示SecondaryAccount→MainAccount,同时取净额的绝对值作为最终金额。
- 若净额为正,说明
测试结果验证
针对你的测试数据:
| DebitAccountNumber | CredtiAccountNumber | Amount |
|---|---|---|
| A | C | 10 |
| C | A | 20 |
| A | C | 40 |
执行代码后会得到结果:
| DebitAccountNumber | CredtiAccountNumber | NetAmount |
|---|---|---|
| A | C | 30 |
完全符合你期望的净额计算结果。
注意事项
- 账号排序采用字典序,如果你使用的是数字型账号或有特殊排序规则,可调整
CASE语句中的比较逻辑; - 若存在净额为0的交易对(比如A→C 50,C→A 50),可以通过
HAVING子句过滤,或者保留显示金额为0的记录。
内容的提问来源于stack exchange,提问作者HashCoder
相关产品推荐
相关产品推荐

