如何按Assets表账户统计Main表交易金额(区分正负)
解决SQL账户交易总额统计的问题
我来帮你修正这个查询,让它准确实现你要的统计逻辑——按Assets表的账户分组,在Main表中出现在Ac1列时加Amt,出现在Ac2列时减Amt。
现有SQL的问题
你当前的查询直接对Main.Amt求和,没有区分账户是在Ac1还是Ac2的位置,而且用OR关联可能会导致重复计算(比如某条交易的Ac1和Ac2是同一个账户时,这条记录会被关联两次,Amt被累加两次,而正确逻辑应该是加一次减一次抵消为0)。
正确的SQL查询
SELECT a.Account, a.Descript, ROUND(SUM( CASE WHEN a.Account = m.Ac1 THEN m.Amt WHEN a.Account = m.Ac2 THEN -m.Amt ELSE 0 END ), 2) AS TtlAmt FROM Assets a LEFT JOIN Main m ON a.Account = m.Ac1 OR a.Account = m.Ac2 GROUP BY a.Account, a.Descript ORDER BY a.Account;
代码解释
- CASE语句:核心逻辑,判断当前资产账户在交易中的角色:
- 如果是交易的
Ac1,直接加Amt - 如果是交易的
Ac2,加-Amt(相当于减去原金额) - 没有匹配交易的账户,加0
- 如果是交易的
- ROUND(...,2):确保结果保留两位小数,和你预期的
1000.00格式一致 - LEFT JOIN:保证Assets表中所有账户都能出现在结果里,哪怕没有任何交易记录(此时TtlAmt为0.00)
- GROUP BY:按账户编号和描述分组,符合你按每个账户统计的需求
和你Excel公式的对应关系
你用Excel的SUM(SUMIF(...), SUMIF(...)*-1)的思路,和这个SQL里的CASE逻辑完全一致:分别统计账户在Ac1列的总金额(加),以及在Ac2列的总金额(减),最后汇总。
内容的提问来源于stack exchange,提问作者Nick Fleetwood
相关产品推荐
相关产品推荐

