">员工";表
emp_id | empName |
---|---|
1 | ABC |
2 | xyx |
您的查询中有一些拼写错误:
- 考虑到当前输出,
GROUP_CONCAT
函数中的分隔符应该是逗号,而不是空格,尽管逗号是默认值,所以您确实可以省略该子句 - 选择中的每个别名都需要它的来源表,只要这些字段名在您要加入的表中的多个表中使用即可
GROUP BY
子句应该至少包含SELECT
子句中未聚合的每个字段,以便具有潜在的正确输出
查询中的总体概念问题是联接将">员工";表的每一行客户端";表(导致聚合期间出现多行和更高的金额总和)。走出兔子洞的一种方法是在"兔子洞"上进行第一次聚集客户端";表(每个">emp_id"值有一行),然后与其他表连接。
SELECT emp.emp_id,
emp.empName,
cl.clientName,
SUM(coll.Amount)
FROM employee emp
LEFT JOIN (SELECT emp_id,
GROUP_CONCAT(client.clientName
ORDER BY client.id) AS clientName
FROM client
GROUP BY emp_id) cl
ON cl.emp_id = emp.emp_id
LEFT JOIN (SELECT emp_id, Amount FROM collection) coll
ON coll.emp_id = emp.emp_id
GROUP BY emp.emp_id,
emp.empName,
cl.clientName
请在此处查看演示。
不管我的评论如何,这里有一个查询您想要的输出:
SELECT
a.emp_id,
a.empName,
a.clientName,
SUM(col.Amount) AS totalCollection
FROM (SELECT e.emp_id,
e.`empName`,
GROUP_CONCAT(DISTINCT c.clientName ORDER BY c.id ) AS clientName
FROM employee e
LEFT JOIN `client` c
ON c.emp_id = e.emp_id
GROUP BY e.`emp_id`) a
LEFT JOIN collection col
ON col.emp_id = a.emp_id
GROUP BY col.emp_id;
当有多个joins
时,应该注意查询生成的关系和结果(行)数。输出中可能有多个记录,而不是所需的记录。希望这能帮助
SELECT emp_id,
empName,
GROUP_CONCAT(client.clientName ORDER BY client.id SEPARATOR '') AS clientName,
C .Amount
FROM employee
LEFT JOIN client
ON clent.emp_id = employee.emp_id
LEFT JOIN (select collection.emp_id , sum(collection.Amount ) as Amount from collection group by collection.emp_id) C
ON C.emp_id = employee.emp_id
GROUP BY employee.emp_id;
它现在对我有效