查询以计算在 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)
下面是 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)