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

如何通过SQL从交易明细中统计借贷方及总交易金额?

解决交易记录表的双向统计问题

嗨,我来帮你搞定这个SQL统计需求~ 先明确一下你的目标:把同一对交易伙伴之间的双向交易合并,统计总交易额,以及其中一方的转出(Debited)和转入(Credited)金额。

首先看你的源表数据:

From|To |Amt |In_out
A | B | 100 |0
B | A | 200 |1
C | D | 250 |0

你需要的结果是把A↔B的交易合并成一行,C→D的单独一行,计算总交易额、A(或C)的转出和转入金额。

正确的SQL解决方案

这里的核心思路是:先把每一对交易伙伴统一成一个唯一的组合(比如按字母顺序确定主方和对方),然后分别统计主方的转出和转入金额,同时计算总交易额。

SELECT
    -- 统一交易对的顺序,确保A↔B只会被归为一组
    CASE WHEN r.`From` < r.`To` THEN r.`From` ELSE r.`To` END AS `From`,
    CASE WHEN r.`From` < r.`To` THEN r.`To` ELSE r.`From` END AS `To`,
    SUM(r.Amt) AS `Amount Transacted`,
    -- 统计主方作为转出方的总金额(也就是原记录中From是主方的情况)
    SUM(CASE WHEN r.`From` = CASE WHEN r.`From` < r.`To` THEN r.`From` ELSE r.`To` END THEN r.Amt ELSE 0 END) AS `Debited`,
    -- 统计主方作为转入方的总金额(也就是原记录中To是主方的情况)
    SUM(CASE WHEN r.`To` = CASE WHEN r.`From` < r.`To` THEN r.`From` ELSE r.`To` END THEN r.Amt ELSE 0 END) AS `Credited`
FROM Records r
GROUP BY `From`, `To`;

为什么这个方案有效?

  • 统一交易对:通过CASE语句,把A↔B这样的双向交易统一成From=A, To=B的唯一组合,避免重复统计。
  • 精准计算Debited和Credited:用嵌套的CASE判断当前记录是否属于主方的转出/转入,然后累加对应金额。
  • 总交易额:直接SUM(Amt)就能得到同一交易对的所有交易总和。

针对你原有查询的问题

你之前的自连接逻辑没抓准核心需求,而且DISTINCT和未完成的GROUP BY会导致结果混乱。这个需求不需要自连接,只需要通过分组和条件聚合就能解决。

执行上面的SQL后,就能得到你想要的结果:

From | To | Amount Transacted | Debited | Credited
A | B | 300 |100 | 200
C | D | 250 |250 | 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:48:51