You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

代码逻辑说明

  1. 标准化账号对:
    通过CASE语句将每笔交易的借贷账号按字典序排序,生成MainAccount和SecondaryAccount。这样A→C和C→A都会被归为(A, C)这同一个分组。

  2. 调整金额方向:
    对于正向交易(MainAccount→SecondaryAccount),金额保持正数;对于反向交易(SecondaryAccount→MainAccount),金额转为负数。这样分组求和时就能自动计算出两组交易的净额。

  3. 确定最终显示方向:
    根据净额的正负判断哪一方是最终的借方/贷方:

    • 若净额为正,说明MainAccount向SecondaryAccount的总转出更多,显示MainAccount→SecondaryAccount;
    • 若净额为负,说明SecondaryAccount向MainAccount的总转出更多,显示SecondaryAccount→MainAccount,同时取净额的绝对值作为最终金额。

测试结果验证

针对你的测试数据:

DebitAccountNumberCredtiAccountNumberAmount
AC10
CA20
AC40

执行代码后会得到结果:

DebitAccountNumberCredtiAccountNumberNetAmount
AC30

完全符合你期望的净额计算结果。

注意事项

  • 账号排序采用字典序,如果你使用的是数字型账号或有特殊排序规则,可调整CASE语句中的比较逻辑;
  • 若存在净额为0的交易对(比如A→C 50,C→A 50),可以通过HAVING子句过滤,或者保留显示金额为0的记录。

内容的提问来源于stack exchange,提问作者HashCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:32:26