2009-12-15 32 views
1

我有一個需求。我一直在考慮下表獲取總資源數量所需的幫助(SQL Server 2005)

DownLineid UplineId Name DirectResources 
1    2  Sarvesh  7 
2   NULL  Admin   5 
3    2  Lonesh   10 
4    2  Swapna   2 
5    2  Priyanka  12 
8    2   Sumi   1 
6    5   Deepak   10 
7    5  Agnijita   6 
9    5   Me    1 

的情況是UplineId意味着高層管理人員和Downlines的指經理下Upliners工作。

我的任務是找出上層人員的總資源。期望的輸出是

UplineId DownLineid Name DirectResources TotalResources 
NULL   2   Admin   5    54 
2 3      Lonesh  10   null 
2 5      Priyanka 12    17 
5 7       Agnijita 6   null 
5 6       Deepak 10   null 
5 9       Me   1   null 
2 1     Sarvesh   7   null 
2 8     Sumi    1   null 
2 4     Swapna   2   null 

實際上,管理員是頂部,並擁有所有的資源。因此所有資源的總數是54.

Agnijita,Deepak和我在Priyanka下,從此計數是17(6 + 10 + 1)。

對於所有其他沒有下行線從此以後它在那裏是空的。

我嘗試迄今

declare @t table(DownLineid int,UplineId int,Name varchar(10),DirectResources int) 
insert into @t 
    select 1,2,'Sarvesh',7 union all select 2,Null,'Admin',5 union all 
    select 3,2,'Lonesh',10 union all select 4,2,'Swapna',2 union all 
    select 5,2,'Priyanka',12 union all select 8,2,'Sumi',1 union all 
    select 6,5,'Deepak',10 union all select 7,5,'Agnijita',6 union all 
    select 9,5,'Me',1 
select * from @t 
;with cte AS 
(

    SELECT 
     CAST(e.Name AS VARCHAR(1000)) AS [Path] 
     ,e.UplineId 
     ,e.DownLineid 
     ,e.Name 
     ,0 AS [Level] 
     ,e.DirectResources FROM @t e WHERE e.UplineId IS NULL 
    UNION ALL 

    SELECT CAST(c.[Path] + '/' + e.Name AS VARCHAR(1000)) AS [Path] 
     ,e.UplineId 
     ,e.DownLineid 
     ,e.Name 
     , c.[Level]+1 AS [Level] 
     ,e.DirectResources 

    FROM @t e 

    JOIN cte c ON e.UplineId = c.DownLineid 

) 
select 
UplineId 
,DownLineid 
, REPLICATE(' ', [Level]) + Name as [Name] 
,DirectResources 

FROM cte 
ORDER BY [Path] 

我苦苦尋找的總資源。我正在使用SQL Server 2005.

請幫幫我。

在此先感謝。

+0

寫了一段時間,回來在你的榜樣,'Admin'的總和包括他自己的資源,但'Priyanka'的一個沒有。它的目的是? – Quassnoi 2009-12-15 15:51:46

+0

如果您計劃遷移到SQL Server 2008,看起來像您可以使用hierarchyIDs(http://blogs.msdn.com/manisblog/archive/2007/08/17/sql-server-2008-hierarchyid.aspx) – ram 2009-12-16 12:36:22

+0

使用[group by] [2]和sum [3]子句的[self join] [1]看起來是正確的解決方案。 [1]:http://databases.about.com/od/sql/a/selfjoins.htm [2]:http://technet.microsoft.com/en-us/library/ms177673.aspx [3 ]:http://doc.ddart.net/mssql/sql70/setu-sus_18.htm – Oded 2009-12-15 15:21:43

回答

2
WITH q AS 
     (
     SELECT downlineID AS parent, downlineID AS id 
     FROM mytable 
     UNION ALL 
     SELECT q.parent, m.downlineID AS id 
     FROM q 
     JOIN mytable m 
     ON  m.uplineID = q.id 
     ) 
SELECT q.parent, 
     CASE 
     WHEN EXISTS 
     (
     SELECT NULL 
     FROM mytable mi 
     WHERE mi.uplineID = q.parent 
     ) 
     THEN SUM(directResources) 
     ELSE NULL 
     END AS TotalResources 
FROM q 
LEFT JOIN 
     mytable m 
ON  m.downlineID = q.id 
GROUP BY 
     q.parent 
+0

我認爲這是無效的。 SQL Server只允許自頂向下遞歸,而不是自下而上。我認爲這將得到「不能對包含聚合或子查詢的表達式執行聚合函數」異常。 – Paul 2009-12-15 15:30:12

+0

'@ Paul':對,'EXISTS'應該不在這個總和中。這是一個自頂向下的遞歸(儘管'SQL Server'允許遞歸兩種方式)。 – Quassnoi 2009-12-15 15:39:18

+0

哦,是的,你說得對 - 傻了。 – Paul 2009-12-15 16:05:34

0

我這在我的blog

with Manager AS (

select EmpID,ManID from EmpMan where ManID=1/* assuming that your VP ID is 1, or it can be the top most person whom you want to query on*/ 

union all 

select E.EmpID,E.ManID from EmpMan E 

join Manager M on E.ManID=M.EmpID) 

select * from Manager