具有 group by 和 join 的 MySQL 聚合函数

标签 mysql sql join group-by

我有以下表格架构,我想获取每个类别的金额列总和以及相应类别中的员 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/

相关文章:

Mysql:在一行中获取一个字段的最高值和另一个字段的最低值

PHP 错误 : mysql_num_rows(): supplied argument is not a valid MySQL

python - 如何使用 python pyodbc 检查表中是否存在列?

python - 有条件地在多个索引上加入 pandas DF

mysql - 如何从两个表创建 JSON 数据

sql - Redshift除法结果不包含小数

sql - 如何找到未封闭的连接?超时时间已到。在操作完成之前超时时间已过或服务器没有响应

mySQL - 为每个帖子选择 2 个最新评论

mysql - 从 LEFT JOIN 查询中删除重复项

mysql - 将每个 mysql 记录(多行)存储为 bash 中的变量