我有一个名为managedby的员工和专栏。 我想将实际和目标数字从员工中提升到领导经理到导演等等。
create table
(
empid int
,Name varchar(255)
,actual decimal(38,2)
,target decimal(38,2)
,managedby int
)
及以下是到目前为止所做的事情:
with emp(Period,Label,[name],Unit,Department,[Group],Division,Managed_By,Manager,Actual,Target) as
(
select
a.DW_Time_key Period
,Label
,b.name
,b.Unit
,b.Department
,b.[Group]
,b.Division
,b.Managed_By
,b.Manager
,sum(a.Actual) Actual
,sum(a.Budget) Target
from
KPI_EDW.dbo.Fact_ASO_SCORECARD a
,KPI_EDW.dbo.DIM_Employee b
where
a.DW_EMPLOYEE_KEY = b.DW_EMPLOYEE_KEY
and DW_KPI_KEY = 1008
and DW_Time_key = 200906
--and DW_Division_KEY = 1003
group by
a.DW_Time_key
,b.name
,b.Unit
,b.Department
,b.[Group]
,b.Division
,b.Managed_By
,b.Manager
,b.Label
)
,CTE (Label,[Name],[Manager], Managed_By,Actual,Target,[level]) as
(
select cast(Label as int) Label,[Name],[Manager], null,Actual,Target,0
from emp
where cast(Label as int) = '582'
union all
select
cast(h2.Label as int) Label
,h2.[Name]
,h2.[Manager]
,cast(h2.Managed_By as int) Managed_By
,h2.Actual
,h2.Target
,[level] + 1
from emp h2
inner join cte
on cast(h2.Managed_By as int) = cast(cte.Label as int)
)
select *
from cte
order by [level]
提前致谢
答案 0 :(得分:1)
听起来您需要一种方法来对某个经理以及其下的所有员工的列表中的实际值和目标值求和,以此类推,以获得整个分支的总计。那是对的吗?我写了一个递归函数来在SQL Server中执行此操作。如果我正确理解问题,我可以发布它。
这是:
CREATE FUNCTION [dbo].[ListStaff] (@Supv int)
--Recursively returns tree of managed staff
--select * from ListStaff(5)
RETURNS @result TABLE
(empid int ,
Name varchar(26),
managedby int,
SupvName varchar(26),
NestLev int
)
AS
BEGIN
DECLARE @empid int, @Name char(26), @managedby int, @SupvName char(26)
SELECT @SupvName = supv.Name, @managedby = emp.managedby, @Name = emp.Name
FROM yourTable emp LEFT JOIN yourTable supv
ON emp.managedby = supv.empid
WHERE emp.empid = @Supv
-----------------------
INSERT INTO @result
VALUES (@Supv, @Name, @managedby, @SupvName, @@NESTLEVEL)
-----------------------
SET @empid = (SELECT MIN(emp.empid)
FROM yourTable emp LEFT JOIN yourTable supv
ON emp.managedby = supv.empid
WHERE emp.managedby = @Supv)
WHILE @empid IS NOT NULL
BEGIN
IF @@NESTLEVEL < 32
IF @empid <> @Supv
INSERT INTO @result
SELECT * FROM ListStaff(@empid)
SET @empid = (SELECT MIN(emp.empid)
FROM yourTable emp LEFT JOIN yourTable supv
ON emp.managedby = supv.empid
WHERE emp.managedby = @Supv AND emp.empid > @empid)
END
RETURN
END
/* This draws the organizartion chart in a formatted tree.
select CONVERT(CHAR(1),nestLev) + REPLICATE('-', nestLev * 4 - 4) + Name + ' is supervised by ' + SupvName
FROM ListStaff(@bossid)
*/
/* link the results back to your table to get values like this:
SELECT *
FROM ListStaff(5) supv
INNER JOIN yourTable
ON supv.empid = yourTable.empid
*/