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

ありがとうございました。はい、私はSQL再帰関数を期待しています..多くのありがとう – Abacus

関連する問題