2009-07-21 2 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

최저 인사말 이제까지. –

+1

정확한 질문을 구체적으로 적어 줄 수 있습니까? – waiwai933

답변

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

Jon님께 감사드립니다. 네, SQL recursive 함수를 기대할 것입니다 .. Many Thanks – Abacus