下面是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)
请问有人解释为什么会这样,我只要求解释。
答案 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)