2016-02-23 58 views
0

我正在嘗試對多層次層次結構進行某種運行總計。TSQL:層次結構從上到下的總和

樣品表。我添加了空格來強調分組。

+----------------+----------------+------------+ 
| 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 | 
+----------------+----------------+------------+ 

道歉用於給出不正確希望的輸出。我已經更新了表格。

基本上,這是層級的樣子基於初始表:

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 

至於所需的輸出,保拉·理查茲應該得到保拉·理查茲(她的成本)+安德魯·博伊德的總和。瑞安麥克唐納將Ryan Mcdonald(hir費用)的總和降到Andrew Boyd。哈里里維拉只會是哈里里維拉+布魯斯麥科伊。最後帕梅拉喬丹將帕米拉喬丹(她的成本)的總和下降到安德魯博伊德。

我想在SQL 2008R2中編寫查詢。

更新:增加CTE基表

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 
) 
+0

期望的輸出非常混亂。爲什麼所有其他團體的累積價值非常大,然後Harry/Bruce線沒有? – dfundako

+0

爲什麼瑞安麥克唐納/羅傑加德納不包括雪莉奧爾蒂斯的價值?你如何確定每個經理的員工順序應該是什麼? –

+0

Hi @BaconBits。確定每位經理的員工順序也是我的問題。不確定這是否可以使用遞歸查詢 – ggarcia

回答

0

我TRINK此查詢適合您的需要。

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 
+0

Hi @ Polux2實現。對不起,但它沒有得到所需的輸出。 – ggarcia

+0

@ggarcia你說得對,我糾正了我的疑問,對不起。 – Polux2