Sql 查询选择经理及经理下员工工资总额

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

我需要写一个查询来选择经理和经理下员工的总工资

员工的工资应根据层级向经理上卷。Mgrid在同一个表中引用empid

表:雇员

输出应为经理姓名和工资

在上面的例子中:M2的正下方有M3、M4、M6。此外,M4下有M5,M5下有M7。因此,这些员工也应该包括在M2的总数中

我尝试使用递归CTE,但在累积工资时失败了

感谢您的帮助

查询:


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