SQLServer 2008如何找到所有行的总和及行组成部分的总和?

4

/* 我在SQLServer 2008中查询时遇到一个问题,需要找到所有行和部分行的总和。我使用了ROW_NUMBER()和outer_apply,但无法解决问题。我在stack_overflow上搜索了几天,但没有找到任何类似的内容。现在我甚至不知道该怎么做。有人能帮我吗???*/

输入数据:区段号码、起始节点、终止节点、面积,区段是两个节点之间的距离。每个节点都属于特定的区域。

A       B       C      D        
--------------------------------
Section Initial Final  Area     
Number  Node    Node                  
================================
1       0       1      0    
2       1       2      5    
3       2       3      3.1  
4       3       4      3.7  
5       4       5      2.7  
6       5       6      0    
7       6       7      4.1  
8       7       8      0    
9       8       9      2.8  
10      9       10     4.6  
11      10      11     3.2
12      11      12     3    
13      12      13     5    
14      13      14     3.5  
15      1       15     3    
16      15      16     5.6  
17      16      17     4.7  
18      17      18     2.8   
19      6       19     0    
20      19      20     3.8  
21      20      21     5    
22      19      22     2.9  
23      8       23     4.4  

/* 需要计算每个节点所属的累积面积(Cumulative Area),结果应该如下 */

A       B       C     D        E        F
-----------------------------------------------------
Section Initial Final  Area     Area     Description
Number  Node    Node            Cum               
=====================================================
1       0       1       0       72.9    =SUM(D1:D23)
2       1       2       5       56.8    =SUM(D2:D14)+SUM(D19:D23)
3       2       3       3.1     51.8    =SUM(D3:D14)+SUM(D19:D23)
4       3       4       3.7     48.7    =SUM(D4:D14)+SUM(D19:D23)
5       4       5       2.7     45      =SUM(D5:D14)+SUM(D19:D23)
6       5       6       0       42.3    =SUM(D6:D14)+SUM(D19:D23)
7       6       7       4.1     30.6    =SUM(D7:D14)+D23
8       7       8       0       26.5    =SUM(D8:D14)+D23
9       8       9       2.8     22.1    =SUM(D9:D14)
10      9       10      4.6     19.3    =SUM(D10:D14)
11      10      11      3.2     14.7    =SUM(D11:D14)
12      11      12      3       11.5    =SUM(D12:D14)
13      12      13      5       8.5     =SUM(D13:D14)
14      13      14      3.5     3.5     =SUM(D14)
15      1       15      3       16.1    =SUM(D15:D18)
16      15      16      5.6     13.1    =SUM(D16:D18)
17      16      17      4.7     7.5     =SUM(D17:D18)
18      17      18      2.8     2.8     =SUM(D18)
19      6       19      0       11.7    =SUM(D19:D22)
20      19      20      3.8     8.8     =SUM(D20:D21)
21      20      21      5       5       =SUM(D21)
22      19      22      2.9     2.9     =SUM(D22)
23      8       23      4.4     4.4     =SUM(D23)

1
你能否进一步描述每个总和的原因,例如在第1行中,你有=SUM(D1:D23),而第2行有=SUM(D2:D14)+SUM(D19:D23),第2行中有什么不在第1行中,这意味着应该排除D15:D18,或者D15:D18中有什么意味着它不应该包括在第2行的总数中?如果你无法用语言解释你的逻辑,那么其他人几乎不可能使用SQL来解释。 - GarethD
我在这里和 @GarethD 一样 - 我看到了一些逻辑,但是我不能完全理解它。 - Roman Pekar
感谢您的关注和时间,GarethD先生和Roman Pekar先生。 - IvanN
这是关于分支式供水网络的内容。每个节点都属于特定的区域(Area),应该满足该区域的用水需求。在每个节点自上而下(1-23)需要通过输送水来满足表面的用水需求。在此阶段,有必要确定每个节点累积的表面积(AreaCum)属于多少。 - IvanN
问题在于,在某些向下的地方存在节点分隔符(面积=0),例如在NOD 1(0-1)中,网络被分成了两条路线,即1-14和1-18。这意味着1-18路线的表面不属于1-14路线,因为1-18路线的表面高于1-14路线的表面。 - IvanN
例如:NOD 1属于所有节点向下的表面,因此累积面积(AreaCum)为72.9(公顷),而节点2的表面属于较少的节点,其累积面积为56.8(公顷),它比属于累积路线1-18(SectionNumber 15,InitialNode 1,FinalNode 15 = 16.1公顷)的少16.1(公顷)。NOD 6也是如此。 - IvanN
1个回答

1

使用递归CTE,您可以做到像这样:

WITH RCTE AS 
(
    SELECT *, NULL S  FROM Table1
    UNION ALL
    SELECT t.*, COALESCE(r.S,r.SectionNumber) S FROM Table1 t
    INNER JOIN RCTE r ON r.FinalNode = t.InitialNode  
)
, CTE2 AS 
(
    SELECT S, SUM(Area) AS AreaCum FROM RCTE 
    GROUP BY S
)
SELECT t.*, COALESCE(c.AreaCum, t.Area) AreaCum FROM Table1 t
LEFT JOIN CTE2 c ON t.SectionNumber = c.S

SQLFiddle演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接