Sql 查询选择经理及经理下员工工资总额
我需要写一个查询来选择经理和经理下员工的总工资 员工的工资应根据层级向经理上卷。Mgrid在同一个表中引用empid 表:雇员 输出应为经理姓名和工资 在上面的例子中:M2的正下方有M3、M4、M6。此外,M4下有M5,M5下有M7。因此,这些员工也应该包括在M2的总数中 我尝试使用递归CTE,但在累积工资时失败了 感谢您的帮助 查询:Sql 查询选择经理及经理下员工工资总额,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要写一个查询来选择经理和经理下员工的总工资 员工的工资应根据层级向经理上卷。Mgrid在同一个表中引用empid 表:雇员 输出应为经理姓名和工资 在上面的例子中:M2的正下方有M3、M4、M6。此外,M4下有M5,M5下有M7。因此,这些员工也应该包括在M2的总数中 我尝试使用递归CTE,但在累积工资时失败了 感谢您的帮助 查询: Create table Emp_Manager ( Empid int identity, EmpName varchar(100), Salary
Create table Emp_Manager
(
Empid int identity,
EmpName varchar(100),
Salary int,
Mgrid int)
insert into Emp_Manager values('CEO',10000,NULL),('M2',8000,1),('M3',6000,2)
,('M4',6000,2),('M5',5000,4),('M6',1000,2),('M7',500,5)
;With Cte_manager as
(Select Empid,Empname , Salary,Mgrid,0 AS Hierchacy FROM Emp_Manager WHERE mgrid is null
union all
Select e.Empid,e.Empname ,e.Salary,e.Mgrid, Hierchacy + 1 AS Hierchacy FROM Emp_Manager as E
inner join Cte_manager as c on e.mgrid = c.empid
) ,
cte_emp as (Select Empid,empname , Hierchacy,
Sum(Salary) Over (order by Hierchacy rows between 1 following and unbounded following) AS Salary
from Cte_manager)
Select Empname AS Managername,Salary as TotalSal FROM cte_emp as c
WHERE Exists (Select 1 FROM Emp_Manager WHERE mgrid = c.empid)
order by Hierchacy
Query result:
CEO 26500
M2 18500
M4 11500
M5 500
M4是错误的。。。我使用层次结构进行汇总的方式不正确。我想不出任何其他方法,下面的解决方案为经理分配一个0的工资,作为他们员工工资递归总和的开始。这样就不需要层次列、第二个CTE CTE_emp或在1个跟驰和无界跟驰之间按层次结构行排序的复杂总和聚合 样本数据 解决方案 结果
通过中间步骤查看实际情况。下面的解决方案为经理分配一个0的工资,作为其员工工资递归总和的起点。这样就不需要层次列、第二个CTE CTE_emp或在1个跟驰和无界跟驰之间按层次结构行排序的复杂总和聚合 样本数据 解决方案 结果
通过中间步骤查看实际情况。您使用的是哪种dbms?Microsoft SQL Server请向我们展示您的尝试-它不起作用并不重要,我们将提供帮助。更新了您正在使用的dbms的查询?Microsoft SQL Server请向我们展示您的尝试-它不起作用并不重要,这就是我们要帮助的。更新了queryPerfect。非常感谢你,非常好。多谢各位
Name TotalSalary
----------------------
CEO 26,500 (total salary of all employees under him/her)
M2 18,500 (Salary of M3 +M4 + M5 + M6 + M7).
M4 5,500 (salary of M5+M7)
M5 500 (Salary Of M7)
Create table Emp_Manager
(
Empid int identity,
EmpName varchar(100),
Salary int,
Mgrid int)
insert into Emp_Manager values('CEO',10000,NULL),('M2',8000,1),('M3',6000,2)
,('M4',6000,2),('M5',5000,4),('M6',1000,2),('M7',500,5)
;With Cte_manager as
(Select Empid,Empname , Salary,Mgrid,0 AS Hierchacy FROM Emp_Manager WHERE mgrid is null
union all
Select e.Empid,e.Empname ,e.Salary,e.Mgrid, Hierchacy + 1 AS Hierchacy FROM Emp_Manager as E
inner join Cte_manager as c on e.mgrid = c.empid
) ,
cte_emp as (Select Empid,empname , Hierchacy,
Sum(Salary) Over (order by Hierchacy rows between 1 following and unbounded following) AS Salary
from Cte_manager)
Select Empname AS Managername,Salary as TotalSal FROM cte_emp as c
WHERE Exists (Select 1 FROM Emp_Manager WHERE mgrid = c.empid)
order by Hierchacy
Query result:
CEO 26500
M2 18500
M4 11500
M5 500
create table Employee
(
EmpId int,
Name nvarchar(3),
Salary money,
MgrId int
);
insert into Employee (EmpId, Name, Salary, MgrId) values
(1, 'CEO', 10000, NULL),
(2, 'M2', 8000, 1),
(3, 'M3', 6000, 2),
(4, 'M4', 6000, 2),
(5, 'M5', 5000, 4),
(6, 'M6', 1000, 2),
(7, 'M7', 500, 5);
with rcte as
(
select e.Name as ManagerName,
convert(money, 0) as Salary,
e.EmpId as EmpId
from Employee e
where exists ( select 'x'
from Employee ee
where ee.MgrId = e.EmpId)
union all
select r.ManagerName,
e.Salary,
e.EmpId
from rcte r
join Employee e
on e.MgrId = r.EmpId
)
select r.ManagerName,
sum(r.Salary) as TotalSalary
from rcte r
group by r.ManagerName;
ManagerName TotalSalary
----------- -----------
CEO 26500.0000
M2 18500.0000
M4 5500.0000
M5 500.0000