【问题标题】:SQL-Sum Values until reach a specific value in another columnSQL-Sum Values 直到达到另一列中的特定值
【发布时间】:2019-11-03 22:46:18
【问题描述】:

我有以下 2 个表:

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

我需要用表 2 的 Col3 之和来更新 Table 1Col3 的值,直到表 2 的 Col2 达到表 1 的 Col2 的值。所以,表 1 应该如下所示:

Col1|Col2|Col3
Val1 T1    6
Val2 T2    3

因此,T1 的 1+2+3 = 6 和 T2 的 1+2 = 3 相加。

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

【问题讨论】:

  • until Col2 of Table 2 reaches the value from Col2 of Table 1是什么意思
  • 首先,我建议在您的示例中添加一行,可能是表 2 中的 Val1/X/4,以便读者可以看到有要排除的行。其次,为了回答这个问题,必须定义table2中的行顺序:table2中你的order-by是什么?
  • 例如,它应该求和,直到表 2 的 Col2 等于 T1,这是表 1 的 Column2 的值。
  • @stackoverflow,是否有用于对行进行排序的列?
  • @stackoverflow,你试过我的答案了吗?好不好用?

标签: sql sql-server tsql sql-server-2008 sql-server-2008-r2


【解决方案1】:

你可以通过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

【讨论】:

  • @GordonLinoff,感谢您的更新。它对我未来有帮助。
【解决方案2】:

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

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;

或者,您可以使用窗口函数(但不是累积和):

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 

【讨论】:

  • 非常感谢戈登。我最终在光标中使用了您的逻辑,因为它有一些额外的要求。
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
相关资源
最近更新 更多