T-SQL CTE count ALL Оставляет под узлом - PullRequest
1 голос
/ 12 мая 2011

Все примеры CTE, которые я могу найти в отношении подсчета, включают классическое «сколько прямых отчетов» имеет менеджер. У меня есть тонкий взгляд на то, что я не могу понять. По сути, я хочу видеть для каждого узла в иерархии, сколько других в TOTAL находятся ниже на ВСЕХ уровнях. Так что, если в компании было 12 человек, у парня наверху было 11 человек под ним, Он может иметь 3 прямых отчета, первый может иметь 2, второй 4 и третий 3 и т. д. Я просто не могу понять, как получить сумму всех под узлом, пожалуйста, помогите!

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Если это должен быть CTE, этот должен работать (запрос основан на базе данных AdventureWorks).Выберите заполнение CTE рекурсивно, строит список всех менеджеров выше указанного EmployeeID.Окончательный выбор подсчитывает все вхождения указанного EmployeeID в столбце AllManager.

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 голосов
/ 06 июля 2011

У вас есть древовидная структура, представленная таблицей со столбцом внешнего ключа с собственной ссылкой, и вы хотите подсчитать количество потомков каждого узла в дереве.Вы получите ответ на свою проблему, прочитав эту статью http://www.sqlmag.com/article/tsql3/calculate-the-sum-of-salaries-in-an-employee-tree- Более подробно в параграфе «Решение на основе рекурсивных CTE».Умная часть заключается в том, что у вас есть свой результат без необходимости строить столбец «Уровень» (если он вам не нужен).

...