【问题标题】:Query to calculate Average of Employee Salaries working under manager in SQL查询以在 SQL 中计算在经理下工作的员工工资的平均值
【发布时间】:2018-09-03 10:00:17
【问题描述】:

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

结果集应该是

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

    (3 rows affected)

有人可以解释一下为什么会这样,我只是要求解释一下。

【问题讨论】:

  • 为什么不显示想要的结果集
  • @Ravi 添加了结果集
  • 你怎么能得到这个拉曼 55000 的平均值,因为 (65000+60000)/2 是 62500

标签: sql sql-server self-join


【解决方案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

【讨论】:

    【解决方案2】:

    我们在这里所做的基本上是由来自 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)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:
          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
          

          【讨论】:

          • 这是这个职位的合适答案。
          猜你喜欢
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 2020-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多