カウントに関して私が見つけることができるすべてのCTEの例には、マネージャーが持っている直属の部下の数が含まれています. 私には、私が理解できないことについて微妙な見方があります。基本的に、階層内の各ノードについて、すべてのレベルの下にある TOTAL 内の他のノードの数を確認したいと考えています。ですから、私が会社に 12 人いたとしたら、一番上の人はその下に 11 人います。彼には 3 人の直属の部下がいるかもしれません。1 人目は 2 人、2 人目は 4 人、3 人目は 3 人などです。ノードの下のすべての合計を取得する方法、助けてください!
質問する
2357 次
2 に答える
1
CTE でなければならない場合は、これが機能するはずです (AdventureWorks データベースに基づくクエリ)。Select populating 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
于 2011-06-10T10:40:39.377 に答える
0
自己参照する外部キー列を持つテーブルによって表されるツリー構造があり、ツリー内の各ノードの子孫の数を数えたいとします。この記事http://www.sqlmag.com/article/tsql3/calculate-the-sum-of-salaries-in-an-employee-tree-を読むことで、問題に対する答えが得られます 。再帰的 CTE に基づく」段落。巧妙な部分は、「レベル」列を作成しなくても結果が得られることです (必要ない場合)。
于 2011-07-06T14:34:11.163 に答える