【问题标题】:MySQL Aggregate Function with group by and joinMySQL聚合函数与group by和join
【发布时间】:2015-03-24 21:37:00
【问题描述】:

我有以下表格架构,我想获取每个类别的金额列的总和以及相应类别中的员工人数。

员工

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),但那个也不起作用。

【问题讨论】:

    标签: mysql sql join group-by


    【解决方案1】:

    我相信,您正在寻找两种不同的数据摘要。一个是按类别计算的工资总和,另一个是按类别计算的员工数。

    你需要使用,然后加入,单独的聚合查询来获得这个。

    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 连接形式。它更易于阅读。)

    【讨论】:

    • 很好的解释,我没有使用第一个,但第二个按预期工作。你能详述组合爆炸吗?有什么好的资源可以解释这个吗?
    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多