MySQL聚合函数与group by和join

fan*_*ndi 1 mysql sql join group-by

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

雇员

id | name | category
1  | SC   | G 1.2
2  | BK   | G 2.2
3  | LM   | G 2.2
Run Code Online (Sandbox Code Playgroud)

payroll_histories

id | employee_id | amount
1  | 1           | 1000
2  | 1           | 500
3  | 2           | 200
4  | 2           | 100
5  | 3           | 300
Run Code Online (Sandbox Code Playgroud)

输出表应如下所示:

category | total | count
G 1.2    | 1500  | 1
G 2.2    | 600   | 2
Run Code Online (Sandbox Code Playgroud)

我在下面总结和分组时尝试了这个查询,但我无法让计数工作.

SELECT 
  employee_id, 
  category, 
  SUM(amount) from  payroll_histories,employees   
WHERE employees.id=payroll_histories.employee_id 
GROUP BY category;
Run Code Online (Sandbox Code Playgroud)

我试过了,COUNT(category)但那个也没有用.

O. *_*nes 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
Run Code Online (Sandbox Code Playgroud)

这里的一般原则是避免尝试仅使用一个聚合查询来聚合多种细节实体.您的金额汇总了工资总额,而您的计数汇总了员工.

或者对于您的特定情况,此查询也将起作用.但它没有很好地概括或必要表现良好.

 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
Run Code Online (Sandbox Code Playgroud)

COUNT(DISTINCT ....)将修复来自连接的组合爆炸.

(专业提示:使用显式连接而不是连接的过时table,table WHERE形式.它更容易阅读.)