使用SUM函数关联三张表的SQL查询:汇总主账户交易总额
获取每个Main_id对应的交易总额的SQL实现
先理清楚三张表的关联逻辑:主表和子表通过Main_id是一对多关系,子表和交易表通过Sub_id也是一对多关系,我们需要把三张表关联起来,再按主表的Main_id分组计算交易总额。
表结构回顾
主表(Main)
| Main_id | Main_name |
|---|---|
| 1 | A |
| 2 | B |
子表(Sub)
| Sub_id | Sub_name | Main_id |
|---|---|---|
| 11 | AA | 1 |
| 12 | AB | 1 |
| 22 | BB | 2 |
交易表(Transaction)
| Transaction_ID | Amount | Sub_id |
|---|---|---|
| 1 | 100 | 11 |
| 1 | 200 | 11 |
| 1 | 50 | 22 |
核心SQL语句
下面的语句可以实现需求,同时兼顾了没有交易记录的主表行也能显示(总额为0):
SELECT m.Main_id, m.Main_name, COALESCE(SUM(t.Amount), 0) AS Total_Amount FROM Main m LEFT JOIN Sub s ON m.Main_id = s.Main_id LEFT JOIN Transaction t ON s.Sub_id = t.Sub_id GROUP BY m.Main_id, m.Main_name;
语句细节说明
- 用
LEFT JOIN而非INNER JOIN:确保哪怕某个Main_id没有子表记录或者交易记录,也会出现在结果里,不会被过滤掉 COALESCE(SUM(t.Amount), 0):处理分组后无交易的情况,把NULL转为0,结果更直观GROUP BY m.Main_id, m.Main_name:按照主表的唯一标识和名称分组,保证每个主表条目对应一行汇总结果
示例执行结果
用你提供的测试数据运行后,会得到如下结果:
| Main_id | Main_name | Total_Amount |
|---|---|---|
| 1 | A | 300 |
| 2 | B | 50 |
内容的提问来源于stack exchange,提问作者Ahmed S. Elsenbawy
相关产品推荐
相关产品推荐

