在两个表中按位置平均工资

时间:2019-11-17 16:39:29

标签: mysql sql

有两个表,一个表与员工薪水有关,另一个与部门有关。 表1:

employee_id       name         salary
--------------------------------------
01                K.Irving     30000
02                J.Polk       50000
03                S.Smith      20000
04                D.Rai        35000

表2:

employee_id       name         department
------------------------------------------
01                K.Irving     marketing
02                J.Polk       finance
03                S.Smith      marketing
04                D.Rai        it

我想了解如何找到低于40000的每个部门的平均工资

理想情况下,它应如下所示:

avg_salary         department
-----------------------------
35000              it
25000              marketing

到目前为止,我已经尝试使用以下公式合并两个表,但是我在设置所需条件时遇到了困难:

SELECT table1.employee_id
     , table1.name
     , table1.salary
     , table2.department
  FROM table1 
  LEFT 
  JOIN table2
    ON table1.employee_id = table2.employee_id 
   AND table1.employee_name = table2.employee_name
 ORDER 
    BY salary DESC;

解决方案将以上和以下内容混合使用,我不确定如何将两者结合起来。

SELECT AVG(salary), department
FROM table1, table2
GROUP BY department
HAVING AVG(salary) <40000
ORDER BY salary DESC;

当我使用上面的代码时,我不确定如何获得每个部门的平均工资,所以它需要平均所有薪水。

2 个答案:

答案 0 :(得分:2)

您需要GROUP BY部门,并使用HAVING子句限制结果。

SELECT avg(e.salary) avg_salary,
       d.department
       FROM table2 d
            LEFT JOIN table2 e
                      ON e.employee_id = d.employee_id
       GROUP BY d.department
       HAVING avg(e.salary) < 4000
       ORDER BY e.salary DESC;

但是请注意,您的设计不好。应该有一个部门表,该表仅存储部门,而不存储任何员工。然后应该有一个仅包含用户和部门ID的链接表,以存储哪个雇员在哪个部门中。该表中不应有员工(或部门)名称。

答案 1 :(得分:0)

此问题不需要LEFT JOIN。为了准确定义平均值,您需要在表之间进行匹配。因此:

SELECT avg(e.salary) as avg_salary,
       d.department
FROM table2 d JOIN 
     table2 e
     ON e.employee_id = d.employee_id
GROUP BY d.department
HAVING avg_salary < 4000
ORDER BY e.salary DESC;

为方便起见,您还可以在HAVING子句中使用列别名。