Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 父子关系和销售汇总_Sql_Rollup - Fatal编程技术网

Sql 父子关系和销售汇总

Sql 父子关系和销售汇总,sql,rollup,Sql,Rollup,我有员工表和名为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,

我有员工表和名为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]

提前感谢

听起来您需要一种方法来汇总某个经理手下的所有员工以及他们手下的每个人的实际值和目标值,以此类推,以获得整个分支机构的总数。对吗?我在SQLServer中编写了一个递归函数来实现这一点。如果我正确理解了问题,我可以发布它

这是:

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

你能具体说明你的问题是什么吗?谢谢Jon的回答。是的,我期待SQL递归函数。。非常感谢