我有以下表格架构,我想获取每个类别的金额列总和以及相应类别中的员 worker 数。
员工
id | name | category
1 | SC | G 1.2
2 | BK | G 2.2
3 | LM | G 2.2
payroll_histories
id | employee_id | amount
1 | 1 | 1000
2 | 1 | 500
3 | 2 | 200
4 | 2 | 100
5 | 3 | 300
输出表应该是这样的:
category | total | count
G 1.2 | 1500 | 1
G 2.2 | 600 | 2
我已经在总结和分组下面尝试了这个查询,但我无法使计数正常工作。
SELECT
employee_id,
category,
SUM(amount) from payroll_histories,employees
WHERE employees.id=payroll_histories.employee_id
GROUP BY category;
我已经尝试了 COUNT(category)
但那个也不起作用。
最佳答案
我相信,您正在寻找两种不同的数据摘要。一个是按类别划分的工资总和,另一个是按类别划分的员 worker 数。
您需要使用然后加入单独的聚合查询来获取此信息。
SELECT a.category, a.amount, b.cnt
FROM (
SELECT e.category, SUM(p.amount) amount
FROM employees e
JOIN payroll_histories p ON e.id = p.employee_id
GROUP BY e.category
) a
JOIN (
SELECT category, COUNT(*) cnt
FROM employees
GROUP BY category
) b ON a.category = b.category
这里的一般原则是避免尝试仅使用一个聚合查询来聚合多种详细信息实体。您的金额汇总了工资总额,而您的计数汇总了员工。
或者对于您的特定情况,此查询也将有效。但它不能很好地泛化或必须表现良好。
SELECT e.category, SUM(p.amount) amount, COUNT(DISTINCT e.id) cnt
FROM employees e
JOIN payroll_histories p ON e.id = p.employee_id
GROUP BY e.category
COUNT(DISTINCT....) 将修复来自连接的组合爆炸。
(专业提示:使用显式联接而不是过时的 table,table WHERE
联接形式。它更易于阅读。)
关于具有 group by 和 join 的 MySQL 聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29243379/