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

时间:2018-09-03 10:00:17

标签: sql sql-server self-join

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

根据解决方案集这是错误的。

我的想法是我正在根据条件e1中的manager_id等于雇员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)

请问有人解释为什么会这样,我只要求解释。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

SELECT a.Manager_Id,b.Emp_name as manager ,avg(a.salary) as Average_Salary_Under_Manager 
FROM employee a 
INNER JOIN employee b ON a.Manager_Id = b.Emp_Id 
GROUP BY a.Manager_Id,b.Emp_name

答案 4 :(得分:0)

我们在这里基本上要做的是由E2的经理进行自我加入和分组,他们倾向于为每个manager_id条目重复。然后我们按分组方式检索E2中每个条目的员工ID和姓名,并计算E1中所有条目的平均工资

SELECT E2.EMP_ID, E2.EMP_NAME, AVG(E1.SALARY)
FROM MANAGER_EMP E1
INNER JOIN MANAGER_EMP E2
ON E1.MANAGER_ID = E2.EMP_ID
GROUP BY E2.EMP_ID, E2.EMP_NAME

结果集是

EMP_ID      EMP_NAME                                           EMP_AVG_SALARY
----------- -------------------------------------------------- ---------------
16          Rajesh                                             65000.000000
17          Raman                                              62500.000000
18          Santosh                                            53750.000000

(3 rows affected)