如何通过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
相关产品推荐
相关产品推荐

