求助:基于3张MySQL表的sum()聚合关联查询实现
MySQL多表聚合查询解决方案
针对你需要从三个表中按人员聚合求和的需求,可通过以下SQL语句实现:
核心思路
先分别对每张表按name字段聚合计算总和,再通过获取所有唯一姓名后左连接各聚合结果,确保所有出现过的人员都被包含,缺失的数据自动显示为NULL。
完整SQL语句
SELECT all_names.name, t1.sum_bill AS `sum(bill)`, t2.sum_total AS `sum(total)`, t3.sum_amount AS `sum(amount)` FROM ( -- 提取所有表中出现过的唯一姓名 SELECT name FROM Table_1 UNION SELECT name FROM Table_2 UNION SELECT name FROM Table_3 ) AS all_names LEFT JOIN ( -- 统计Table_1中每人的bill总和 SELECT name, SUM(bill) AS sum_bill FROM Table_1 GROUP BY name ) AS t1 ON all_names.name = t1.name LEFT JOIN ( -- 统计Table_2中每人的total总和 SELECT name, SUM(total) AS sum_total FROM Table_2 GROUP BY name ) AS t2 ON all_names.name = t2.name LEFT JOIN ( -- 统计Table_3中每人的total总和(对应输出的sum(amount)) SELECT name, SUM(total) AS sum_amount FROM Table_3 GROUP BY name ) AS t3 ON all_names.name = t3.name ORDER BY all_names.name;
语句解释
- 获取所有唯一姓名:使用
UNION合并三个表的name字段,自动去重得到所有出现过的人员姓名,避免遗漏只在单个表中存在的人员(比如示例中的Kevin)。 - 左连接聚合结果:将每个表的聚合结果通过
LEFT JOIN关联到唯一姓名集合,确保即使人员在某些表中没有数据,对应的求和列也会显示NULL,符合需求输出格式。 - 字段别名:用
AS给聚合后的字段命名,与需求的输出列名完全匹配。
内容的提问来源于stack exchange,提问作者anikesh sharma
相关产品推荐
相关产品推荐

