查询以计算在SQL中在管理器下工作的员工工资的平均值

问题描述 投票:0回答:3

下面是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)

有人可以解释为什么会这样的逻辑,我只是​​要求解释。

sql sql-server self-join
3个回答
1
投票

因为没有期望的结果集。

请尝试以下查询:

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

0
投票

感谢@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

0
投票

要首先计算经理的平均工资,您需要知道在经理下工作的员工及其各自的工资。

首先,您需要在经理下映射所有员工,以便您可以获得总和。

在您提出的问题中,表使用管理员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

© www.soinside.com 2019 - 2024. All rights reserved.