SQL-对值求和,直到达到另一列中的特定值

SQL-Sum Values until reach a specific value in another column

我有以下2个table:

Col1|Col2|Col3
Val1 T1  
Val2 T2

Col1|Col2|Col3|Col4
Val1 test  1    
Val1 test  2
Val1 T1    3
Val2 test  1
Val2 T2    2

我需要用 table 2 的 Col3 的总和更新 Table 1Col3 的值,直到 Table 2 的 Col2 达到来自 Col2 的值Table 1. 所以,Table 1 应该是这样的:

Col1|Col2|Col3
Val1 T1    6
Val2 T2    3

因此,T1 的总和为 1+2+3 = 6,T2 的总和为 1+2 = 3

基本上,两个 table 的 Col1 都是关键。我正在使用 MSSQL2008 服务器。我尝试用 Cursor 来做到这一点,但到目前为止还没有成功。 请注意,Table2 中按列排序的是日期列(Column4)。它按 Desc.

排序

您可以通过 GROUP BY 获得:

CREATE TABLE #Table1(Col1 VARCHAR(10),Col2 VARCHAR(10),Col3 INT)
CREATE TABLE #Table2(Col1 VARCHAR(10),Col2 VARCHAR(10),Col3 INT,Col4 DATETIME)

INSERT INTO #Table1 VALUES('Val1','T1',0)
INSERT INTO #Table1 VALUES('Val2','T2',0)

INSERT INTO #Table2 VALUES('Val1','test',1,GETDATE())
INSERT INTO #Table2 VALUES('Val1','test',2,GETDATE()-1)
INSERT INTO #Table2 VALUES('Val1','T1',3,GETDATE()-2)
INSERT INTO #Table2 VALUES('Val1','test',4,GETDATE()-3)
INSERT INTO #Table2 VALUES('Val2','test',1,GETDATE())
INSERT INTO #Table2 VALUES('Val2','T2',2,GETDATE()-1)

UPDATE T1
SET T1.Col3 = T2.SummationValue
FROM #Table1 T1
JOIN (
    SELECT T2.Col1,T2.Col2,SUM(T2.Col3) OVER(PARTITION BY T2.Col1 ORDER BY Col4 DESC)SummationValue
    FROM #Table2 T2
    JOIN #Table1 T1 ON T2.Col1 = T1.Col1
    )T2
ON T1.Col1 = T2.Col1 AND T1.Col2 = T2.Col2


SELECT * FROM #Table1

DROP TABLE #Table1
DROP TABLE #Table2

输出:

Col1    Col2    Col3
Val1    T1      6
Val2    T2      3

SQL Fiddle

这有点棘手。您可以使用相关子查询获取截止点:

update t1
    set col3 = t2.sum_col3
from t1 join
     (select t2.col1, sum(t2.col3) as sum_col3
      from t2 
      where t2.t4 >= (select tt2.t4
                      from t2 tt2 join
                           t1 tt1
                           on tt2.col1 = tt1.col1 and
                              tt2.col2 = tt1.col2
                     )
      group by t2.col1
     ) t2
     on t2.col1 = t1.col1;

或者,您可以使用 window 函数(但不是累加和):

update t1
    set col3 = t2.sum_col3
from t1 join
     (select t2.col1,
             sum(t2.col3) as sum_col3
      from (select t2.col1,
                   min(case when tt2.col1 = tt1.col2 then tt2.col4 end) over (partition by tt2.col1) as col4_match
            from t2 tt2 join
                 t1 tt1
                 on tt2.col1 = tt1.col1                           
           ) t2
      where col4 >= col4_match
      group by t2.col1
     ) t2
     on t2.col1 = t1.col1