2011-05-12 57 views
1

下的所有CTE例子,我可以相對於計數發現包括經典的「有多少直接報告」做了經理有。 我有一個微妙的想法,我不知道。 Essenitally我希望看到在一個層次,許多人在總共多少皆下品,各級各節點。 所以如果我在一家公司裏有12個人,那麼他頂下的那個人有11個,他可能有3個直接的報告,第一個可能有2個,第二個4和第三個3 等等 我只是可以不知道如何獲得節點下所有節點的總和,請幫助!T-SQL CTE計算所有葉節點

+1

能否請您介紹一下你的數據結構。你提到了Common Table Expressions,但根據你的表結構可能不需要。 – 2011-05-12 16:20:47

+0

員工表。 – Paul 2011-05-12 16:22:17

+0

員工ID,reports_to_employee-ID,名稱..... Report_to_employee_id FK的員工表,所以它是一個gerneric hierarchry在一個表表示。 – Paul 2011-05-12 16:23:21

回答

1

如果它必須是熱膨脹係數,這個應該工作(基於AdventureWorks數據庫查詢)。 選擇填充CTE以遞歸方式構建給定EmployeeID上方的所有管理者列表。 最終選擇計算AllManagers列中給定EmployeeID的所有出現次數。

WITH EmployeeList (EmployeeID, ManagerID, Level, AllManagers) AS 
    (
     SELECT 
      EmployeeID, 
      ManagerID, 
      0 AS Level, 
      CAST(',' + CAST(EmployeeID AS varchar) + ',' AS varchar) AS AllManagers 
     FROM HumanResources.Employee 
     WHERE ManagerID IS NULL 
     UNION ALL 
     SELECT 
      HumanResources.Employee.EmployeeID, 
      HumanResources.Employee.ManagerID, 
      EmployeeList.level + 1 AS level, 
      CAST(AllManagers + CAST(HumanResources.Employee.EmployeeID AS varchar) + ',' AS varchar) AS AllManagers 
     FROM HumanResources.Employee inner join EmployeeList ON HumanResources.Employee.ManagerID = EmployeeList.employeeID 
    ) 
    SELECT 
     EmployeeID, 
     ManagerID, 
     Level, 
     AllManagers, 
     --have to subtract 1 because AllManagers path includes employee own ID 
     (SELECT COUNT(*) FROM EmployeeList T1 WHERE T1.allmanagers LIKE '%,' + CAST(EmployeeList.employeeid AS varchar) + ',%') - 1 AS Subordinates 
    FROM EmployeeList 
    ORDER BY Level