2011-05-12 3 views
1

계산과 관련하여 찾을 수있는 모든 CTE 예제에는 관리자가 수행하는 고전적인 '얼마나 많은 직접 보고서'가 포함됩니다. 나는 미묘한 생각을 가지고있다. Essenitally 계층 구조의 각 노드에 대해 TOTAL의 다른 노드가 ALL 수준 아래에 있는지 확인하고 싶습니다. 그래서 회사에 12 명이 있었다면 맨 위의 갈라진 금은 그 아래에 11이 있습니다. 그는 3 개의 직접 보고서를 가질 수 있습니다. 첫 번째 보고서는 2, 두 번째는 4 번째, 세 번째는 등입니다. 그냥 할 수 있습니다. 노드 밑에있는 모든 것의 합을 구하는 방법을 알아 내려고합니다. 도와주세요!T-SQL CTE 수 ALL 노드 아래에 남음

+1

데이터 구조에 대해 알려주십시오. Common Table Expressions에 대해 언급했지만 테이블 구조에 따라 필요하지 않을 수도 있습니다. –

+0

직원 테이블 – Paul

+0

employee id, reports_to_employee-id, name ..... Report_to_employee_id fk가 employee 테이블에 있으므로 gerneric 계층 구조가 한 테이블에 표시됩니다. – Paul

답변

1

CTE 여야하는 경우 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 
0

자체 참조 외래 키 열이있는 테이블로 트리 구조가 있고 트리의 각 노드의 하위 노드 수를 계산하려고합니다. 이 기사를 읽으면 문제에 대한 해답을 얻을 수 있습니다. http://www.sqlmag.com/article/tsql3/calculate-the-sum-of-salaries-in-an-employee-tree- 특히 "재귀 적 CTE 기반 솔루션"단락을 참조하십시오. 영리한 부분은 "수준"열을 만들지 않고도 결과를 얻을 수 있다는 것입니다 (필요하지 않은 경우).