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

Query to calculate Average of Employee Salaries working under manager in SQL

下面是 Employee table,其中还包括经理的详细信息。任务是计算经理手下的平均工资:

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

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

我的想法是我正在对员工 table 进行自我加入,条件是来自 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;

结果集应该是

ManagerId   ManagerName     AverageSalary
-----------------------------------------
    16          Rajesh          65000
    17          Raman           62500
    18          Santosh         53750

    (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

要计算一个经理手下的平均工资,首先你需要知道在一个经理手下工作的员工以及他们各自的工资。

首先,您需要映射一个经理手下的所有员工,以便得出总和。

在您提出的查询中,table 使用管理器 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.

的员工

当您在问题中使用查询时,连接条件会查找上面的 condition.It 获取所有低于 1 manager.Sums 的员工及其薪水,并按经理 ID 分组.

此外,您的别名列有误 query.Use @ravi 的回答中的查询

如果您仍然不清楚自连接的工作原理,请勾选此项 Explanation of self-joins

简单fiddle如果你想检查这个,fiddle_example

Thanks @theDbGuy for tips.

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
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

我们基本上在这里做的是来自 E2 的经理自行加入和分组,他倾向于为每个 manager_id 条目重复。我们在 group by 之后检索 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)