我有以下表格模式,我想获得每个类别的金额列的总和以及相应类别中的雇员数量。
雇员
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)
,但那个也没有用。
答案 0 :(得分:5)
我相信,您正在寻找两种不同的数据摘要。一个是按类别划分的工资总额,另一个是员工数,也是按类别划分的。
您需要使用,然后加入,将聚合查询分开来获取此信息。
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
形式的联接。它更容易阅读。)