MySQL聚合函数与group by和join

时间:2015-03-24 21:37:00

标签: mysql sql join group-by

我有以下表格模式,我想获得每个类别的金额列的总和以及相应类别中的雇员数量。

雇员

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),但那个也没有用。

1 个答案:

答案 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形式的联接。它更容易阅读。)