Запрос для расчета средней заработной платы сотрудников, работающих под управлением менеджера в SQL - PullRequest
0 голосов
/ 03 сентября 2018

Ниже приведена таблица 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, сгруппированному по 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)

Может кто-нибудь, пожалуйста, объясните логику, почему так, я прошу только объяснения.

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Для того, чтобы сначала рассчитать среднюю зарплату менеджера, вам нужно знать сотрудников, которые работают под менеджером, и их соответствующую зарплату.

Во-первых, вам необходимо сопоставить всех сотрудников с менеджером, чтобы вы могли получить сумму.

В запросе, который вы поставили в своем вопросе, таблица соединяется с самим собой с помощью идентификатора менеджера (это называется самостоятельным соединением). Объясняя, используя

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

Раджеш - менеджер, у которого есть Викас и Раман. Итак, вам нужно найти сотрудника, у которого manager_id = 16.

Когда вы используете запрос в своем вопросе, тогда условие объединения выполняет поиск вышеуказанного условия. Оно захватывает всех сотрудников и их зарплату, находящихся под одним менеджером. Суммирует их и группирует по идентификатору менеджера.

Также существует ошибка в псевдониме столбца в вашем запросе. Используйте запрос из ответа @ ravi

Отметьте это, если вы все еще не знаете, как работает само присоединение. Объяснение самосоединений

Простая скрипка, если вы хотите проверить это, fiddle_example

0 голосов
/ 03 сентября 2018

Спасибо @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 голосов
/ 03 сентября 2018

Поскольку нет желаемого набора результатов.

Попробуйте запрос ниже:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...