下面是Employee
表,其中还包括经理详细信息。任务是计算经理的平均工资:
emp_id emp_name salary manager_id
----------- -------- --------- -------------
10 Anil 50000.00 18
11 Vikas 75000.00 16
12 Nisha 40000.00 18
13 Nidhi 60000.00 17
14 Priya 80000.00 18
15 Mohit 45000.00 18
16 Rajesh 90000.00 NULL
17 Raman 55000.00 16
18 Santosh 65000.00 17
我写了下面的查询:
SELECT e1.emp_id as manager_id,
e1.emp_name as manager_name,
avg(e2.salary) as employee_avg_salary
FROM employee e1 inner join
employee e2
ON e1.manager_id = e2.emp_id
GROUP BY e1.emp_id, e1.emp_name
ORDER BY e1.emp_id
根据解决方案集,这是错误的。
我的想法是我在员工表上进行自我加入条件manager_id从e1等于e2中的员工ID,因此左侧包含经理集,因此按e1.emp_id和e1.emp_name分组。
目前的解决方案似乎是
select e2.emp_id as "Manager_Id",
e2.emp_name as "Manager",
avg(a.salary) as "Average_Salary_Under_Manager"
from Employee e1,
Employee e2
where e1.manager_id = e2.emp_id
group by e2.emp_id, e2.emp_name
order by e2.emp_id;
结果集应该是
manager_id manager_name employee_avg_salary
----------- ------------ --------------------
16 Rajesh 90000.000000
17 Raman 55000.000000
18 Santosh 65000.000000
(3 rows affected)
有人可以解释为什么会这样的逻辑,我只是要求解释。
因为没有期望的结果集。
请尝试以下查询:
SELECT AVG(e1.Salary) as AvgSalary, e1.Manager_id , e2.emp_name as ManagerName
FROM employee e1
INNER JOIN employee e2 ON e1.Manager_id = e2.emp_id
WHERE e1.Manager_id IS NOT NULL
GROUP BY e1.Manager_id , e2.emp_name
感谢
@theDbGuy
的提示。
create table #avg (emp_id int, emp_name varchar(20),salary int,manager_id int)
insert #avg values
(10,'Anil', 50000.00,18)
,(11,'Vikas', 75000.00,16)
,(12,'Nisha', 40000.00,18)
,(13,'Nidhi', 60000.00,17)
,(14,'Priya', 80000.00,18)
,(15,'Mohit', 45000.00,18)
,(16,'Rajesh', 90000.00,NULl)
,(17,'Raman', 55000.00,16)
,(18,'Santosh',65000.00,17)
select am.emp_id ManagerId, am.emp_name ManagerName
, avg(ae.salary) AverageSalary from #avg aM --Manager
join #avg aE -- Employee
on am.emp_id = aE.manager_id
group by am.emp_id, am.emp_name
order by am.emp_id
ManagerId ManagerName AverageSalary
-----------------------------------------
16 Rajesh 65000
17 Raman 62500
18 Santosh 53750
要首先计算经理的平均工资,您需要知道在经理下工作的员工及其各自的工资。
首先,您需要在经理下映射所有员工,以便您可以获得总和。
在您提出的问题中,表使用管理员ID连接到自身(这称为自连接)。解释使用
emp_id emp_name salary manager_id
----------- -------- --------- -------------
10 Anil 50000.00 18
11 Vikas 75000.00 16
12 Nisha 40000.00 18
13 Nidhi 60000.00 17
14 Priya 80000.00 18
15 Mohit 45000.00 18
16 Rajesh 90000.00 NULL
17 Raman 55000.00 16
18 Santosh 65000.00 17
Rajesh是一名经理,在他身下有Vikas和Raman。因此,您需要找到拥有manager_id = 16的员工。
当你在你的问题中使用查询时,加入条件会查找上述条件。它会抓住一个经理下的所有员工及其工资。将其填入并按经理ID对其进行分组。
此外,您在查询中的列别名中存在错误。使用来自@ ravi的答案的查询
如果你仍然不清楚自我加入如何工作Explanation of self-joins,请检查这一点
如果你想检查这个简单的小提琴,fiddle_example