有两个表,一个表与员工薪水有关,另一个与部门有关。 表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;
当我使用上面的代码时,我不确定如何获得每个部门的平均工资,所以它需要平均所有薪水。
答案 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
子句中使用列别名。