2009-07-21 62 views
2

我有僱員和列名爲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] 

感謝

+2

最好的稱呼永遠。 – 2009-07-21 21:52:33

+1

你能指定你確切的問題是什麼嗎? – waiwai933 2009-07-22 18:48:42

回答

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 
*/