2015-06-22 14 views
6

Tôi có một bảng dữ liệu mà trông như thế này:Làm thế nào để đệ quy tổng hợp thứ bậc cha/con

UnitID UnitParentID ScoreCount ScoreSum Level 
7112      72   292  1 
7120 7112    72   308  2 
7139 7112    24   82  2 
7150 7112    166   586  2 
23682 7112    104   414  2 
7100 7112    272   1016  2 
23691 7112    94   300  2 
23696 7112    24   80  2 
23700 23696    184   594  3 
23694 23691    24   64  3 
23689 7120    88   390  3 
7148 23696    112   420  3 
7126 7120    32   132  3 
7094 7120    96   332  3 
7098 7094    64   240  4 
23687 7094    16   62  4 

Những gì tôi đang tìm cách để làm được một cách đệ quy thêm từ hệ thống cấp bậc thấp nhất đến mức cao nhất cho rằng những con số dưới đây cuộn lên cha mẹ của họ. Vì vậy, một phụ huynh sẽ thêm vào giá trị hiện tại của nó bất kỳ trẻ em, lên cây lên đầu trang.

Trong ví dụ này, hai hàng cuối cùng sẽ không thay đổi vì chúng không có con. Đơn vị ID 7094 sẽ có phiếu ghi điểm là 96 (cơ sở) + 64 + 16 (2 trẻ em) cho tổng số mới là 176 (và cùng một logic cho điểm số). Những người khác ở cấp 3 sẽ không thay đổi vì họ không có con. Tôi tin rằng tôi cần phải bắt đầu ở phía dưới để các lớp ở trên sẽ có giá trị chính xác cho bất kỳ trẻ em nào.

Nếu ai đó có thể chỉ cho tôi một nguồn tốt nơi tôi có thể học cách thực hiện điều này, tôi sẽ rất tuyệt vời.

+0

Bạn có thể sử dụng một đệ quy CTE –

+0

Niêm yết một ví dụ đầu ra – Matt

+3

Câu trả lời đầu tiên cho câu hỏi tôi gắn cờ là trùng lặp nên làm việc cho bạn. Tôi sẽ không đăng các giải pháp như là một câu trả lời bởi vì tôi đã thích nghi nó từ bài đăng được liên kết nhưng dù sao: thích nghi với bảng và dữ liệu của bạn như là giải pháp làm việc: http://www.sqlfiddle.com/#!6/71409/1 – jpw

Trả lời

0

WITH CTE AS ( SELECT 7112 unitid , NULL UnitParentId,72 ScoreCount,292 ScoreSum,1 Level UNION ALL SELECT 7120 unitid ,7112 UnitParentId,72 ScoreCount,308 ScoreSum,2 Level UNION ALL SELECT 7139 unitid ,7112 UnitParentId,24 ScoreCount,82 ScoreSum,2 Level UNION ALL SELECT 7150 unitid ,7112 UnitParentId,166 ScoreCount,586 ScoreSum,2 Level UNION ALL SELECT 23682 unitid ,7112 UnitParentId,104 ScoreCount,414 ScoreSum,2 Level UNION ALL SELECT 7100 unitid ,7112 UnitParentId,272 ScoreCount,1016 ScoreSum,2 Level UNION ALL SELECT 23691 unitid ,7112 UnitParentId,94 ScoreCount,300 ScoreSum,2 Level UNION ALL SELECT 23696 unitid ,7112 UnitParentId,24 ScoreCount,80 ScoreSum,2 Level UNION ALL SELECT 23700 unitid ,23696 UnitParentId,184 ScoreCount,594 ScoreSum,3 Level UNION ALL SELECT 23694 unitid ,23691 UnitParentId,24 ScoreCount,64 ScoreSum,3 Level UNION ALL SELECT 23689 unitid ,7120 UnitParentId,88 ScoreCount,390 ScoreSum,3 Level UNION ALL SELECT 7148 unitid ,23696 UnitParentId,112 ScoreCount,420 ScoreSum,3 Level UNION ALL SELECT 7126 unitid ,7120 UnitParentId,32 ScoreCount,132 ScoreSum,3 Level UNION ALL SELECT 7094 unitid ,7120 UnitParentId,96 ScoreCount,332 ScoreSum,3 Level UNION ALL SELECT 7098 unitid ,7094 UnitParentId,64 ScoreCount,240 ScoreSum,4 Level UNION ALL SELECT 23687 unitid ,7094 UnitParentId,16 ScoreCount,62 ScoreSum,4 Level ), RECURSIVECTE AS ( SELECT unitid, CONVERT(NVARCHAR(MAX),convert(nvarchar(20),unitid)) PARENTLIST, ScoreCount FROM CTE WHERE UnitParentId IS NULL

UNION ALL

SELECT C.unitid, CONVERT(NVARCHAR(MAX),convert(nvarchar(20),R.PARENTLIST) + ',' + convert(nvarchar(20),C.unitid)), C.ScoreCount
FROM RECURSIVECTE R INNER JOIN CTE C ON R.unitid = C.UnitParentId )

SELECT C.unitid, R.ScoreCount FROM CTE C CROSS APPLY ( SELECT SUM(ScoreCount) ScoreCount FROM RECURSIVECTE R WHERE CHARINDEX(convert(nvarchar(20),C.UNITID), R.PARENTLIST,0) > 0 ) R

Các vấn đề liên quan