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
我正在尝试对多级层次结构进行某种 运行 总计。
样本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