如何在多表中结合GROUP_CONCAT与GROUP BY实现SUM统计?
解决工具分配统计的SQL查询问题
看起来你在统计工具分配情况时遇到了分组和字符串拼接的问题,先帮你梳理下现有语句的问题,再给出正确的解决方案:
现有语句的问题
- 拼写错误:
user.deparment应该是users.department,tool_asigned应该是tool_assigned - 分组逻辑错误:你当前按
tools.name和users.department分组,会得到每个工具对应每个部门的单独行,而不是按工具汇总所有部门的统计信息
正确的SQL语句
要实现你需要的结果,我们需要先按「工具+部门」统计各部门的分配总量,再按工具做二次聚合,拼接部门统计信息:
SELECT t.id AS id_tool, t.name AS tool_name, SUM(sub.dept_total) AS total_quantity, GROUP_CONCAT(CONCAT(u.department, '-', sub.dept_total) ORDER BY u.department SEPARATOR ', ') AS summary_department FROM tools t INNER JOIN ( -- 子查询:先统计每个工具在每个部门的总分配数量 SELECT ta.id_tool, u.department, SUM(ta.quantity) AS dept_total FROM tool_assigned ta INNER JOIN users u ON ta.id_user = u.id GROUP BY ta.id_tool, u.department ) sub ON t.id = sub.id_tool GROUP BY t.id, t.name ORDER BY t.id;
语句说明
- 子查询部分:关联
tool_assigned和users表,按工具ID和部门分组,计算每个工具在对应部门的总分配量,得到「工具-部门-部门总量」的中间结果。 - 外层查询:关联工具表和子查询结果,按工具ID和名称分组:
SUM(sub.dept_total):累加该工具所有部门的分配量,得到总数量GROUP_CONCAT(...):将每个部门的「部门名-数量」字符串用逗号拼接,ORDER BY u.department可以让部门按字母顺序排列,结果更整洁
- 最后按工具ID排序,确保结果顺序和你期望的一致
执行这个语句后,会得到符合需求的统计结果(注:你的示例结果里c-2应该是笔误,因为你的用户表只有a和b两个部门)。
内容的提问来源于stack exchange,提问作者Jhon Maldonado
相关产品推荐
相关产品推荐

