TSQL:层次结构从上到下求和

TSQL: Sum from top to bottom of hierarchy

我正在尝试对多级层次结构进行某种 运行 总计。

样本table。我添加了空格以强调分组。

+----------------+----------------+------------+
|    Manager     |    Employee    |    Cost    |
+----------------+----------------+------------+
| Donald Torres  | Pamela Jordan  | 7,250.78   |
|                |                |            |
| Pamela Jordan  | Harry Rivera   | 36,721.39  |
| Pamela Jordan  | Ryan Mcdonald  | 5,593.89   |
|                |                |            |
| Harry Rivera   | Bruce Mccoy    | 3,538.19   |
|                |                |            |
| Ryan Mcdonald  | Shirley Ortiz  | 137.20     |
| Ryan Mcdonald  | Roger Gardner  | 9,140.34   |
| Ryan Mcdonald  | Paula Richards | 135,109.59 |
|                |                |            |
| Paula Richards | Andrew Boyd    | 106,676.77 |
+----------------+----------------+------------+

期望的输出

+----------------+----------------+------------+
|    Manager     |    Employee    |    Cost    |
+----------------+----------------+------------+
| Donald Torres  | Pamela Jordan  | 304,168.15 |
| Pamela Jordan  | Harry Rivera   | 40,259.58  |
| Pamela Jordan  | Ryan Mcdonald  | 256,657.79 |
| Harry Rivera   | Bruce Mccoy    | 3,538.19   |
| Ryan Mcdonald  | Shirley Ortiz  | 137.20     |
| Ryan Mcdonald  | Roger Gardner  | 9,140.34   |
| Ryan Mcdonald  | Paula Richards | 241,786.36 |
| Paula Richards | Andrew Boyd    | 106,676.77 |
+----------------+----------------+------------+

很抱歉提供了不正确的期望输出。我已经更新了 table.

基本上,这是基于初始 table:

的层次结构
Donald Torres                   
    Pamela Jordan               7,250.78
        Harry Rivera            36,721.39
            Bruce Mccoy         3,538.19
        Ryan Mcdonald           5,593.89
            Shirley Ortiz       137.20
            Roger Gardner       9,140.34
            Paula Richards      135,109.59
                Andrew Boyd     106,676.77

关于所需的输出,Paula Richards 应该得到 Paula Richards(她的成本)+ Andrew Boyd 的总和。 Ryan Mcdonald 将 Ryan Mcdonald(他的成本)的总和归结为 Andrew Boyd。哈里·里维拉只会是哈里·里维拉 + 布鲁斯·麦考伊。最后,Pamela Jordan 会将 Pamela Jordan(她的成本)的总和减给 Andrew Boyd。

我正在尝试在 SQL 2008R2 中编写查询。

更新:添加 cte 基础 table

With Tabl_1 (Manager, Employee, Cost) as (
    Select 'Donald Torres'  , 'Pamela Jordan'  , 7250.78   UNION ALL
    Select 'Pamela Jordan'  , 'Harry Rivera'   , 36721.39  UNION ALL
    Select 'Pamela Jordan'  , 'Ryan Mcdonald'  , 5593.89   UNION ALL
    Select 'Harry Rivera'   , 'Bruce Mccoy'    , 3538.19   UNION ALL
    Select 'Ryan Mcdonald'  , 'Shirley Ortiz'  , 137.20     UNION ALL
    Select 'Ryan Mcdonald'  , 'Roger Gardner'  , 9140.34   UNION ALL
    Select 'Ryan Mcdonald'  , 'Paula Richards' , 135109.59 UNION ALL
    Select 'Paula Richards' , 'Andrew Boyd'    , 106676.77
)

我认为这个查询符合您的需要。

With Table_1 (Manager, Employee, Cost) as (
    Select 'Donald Torres'  , 'Pamela Jordan'  , 7250.78   UNION ALL
    Select 'Pamela Jordan'  , 'Harry Rivera'   , 36721.39  UNION ALL
    Select 'Pamela Jordan'  , 'Ryan Mcdonald'  , 5593.89   UNION ALL
    Select 'Harry Rivera'   , 'Bruce Mccoy'    , 3538.19   UNION ALL
    Select 'Ryan Mcdonald'  , 'Shirley Ortiz'  , 137.20     UNION ALL
    Select 'Ryan Mcdonald'  , 'Roger Gardner'  , 9140.34   UNION ALL
    Select 'Ryan Mcdonald'  , 'Paula Richards' , 135109.59 UNION ALL
    Select 'Paula Richards' , 'Andrew Boyd'    , 106676.77
),
CTE as
    (
        select Manager as Manager, Employee as Employee, 1 as Level, Cost as Cost
        from Table_1
        Union All
        select C.Manager, T.Employee, C.Level + 1, T.Cost
        from CTE as C inner join Table_1 as T on C.Employee = T.Manager
    )

select Manager, 
       Employee, 
       T_Cost = Cost + isnull((select SUM(Cost) 
                               from CTE C2 
                               where C2.Manager = C1.Employee)
                             ,0) 
from CTE C1 
where Level = 1