使用T-SQL

时间:2016-06-29 11:56:50

标签: sql-server tsql sum insert-update

我有一个临时表(#Temptable3)我正在填充以帮助构建数据集以进行报告。我通过一些试验和错误解决了大多数逻辑步骤,并在此找到了之前问题的答案(谢谢!)然而无法破解最后一点。为简化起见,我从下面的示例数据集中删除了不相关的列:

我目前有:

RowNumber   Increment   Score
-----------------------------
    1             1     NULL
    2        100000     NULL
    3            -1     NULL
    4             1     NULL
    5            10     NULL
    6            -1     NULL
    7       -100000     NULL
    8           -10     NULL

我打算得到的是得分列,用“增量之和”列填充并包括它自己的行,例如:

RowNumber   Increment   Score
-----------------------------
    1          1            1
    2     100000       100001
    3         -1       100000
    4          1       100001
    5         10       100011
    6         -1       100010
    7    -100000           10
    8        -10            0

我已经尝试过但未能获得各种更新语句,使用自联接,但找不到任何看起来很有希望的东西。如果这还不够,请道歉。如果需要,请提出问题感谢您的帮助。

感谢HABO指针,帮助我找到关于运行总和的问题。 janderssons reply中与前一个问题的链接引导我找到适合我的解决方案:

声明@runningtotal int 设置@runningtotal = 0

更新#TempTable3 设置@runningtotal =得分= @runningtotal +增量

来自#TempTable3

3 个答案:

答案 0 :(得分:2)

类似的东西:

SELECT  [RowNumber], Increment
      , SUM(Increment) OVER(ORDER BY [RowNumber]) AS Score
FROM    Your_Table

应该做的伎俩。请参阅here

对于未来的读者:显然,over语法在sql server 2012中可用,但不在sum() over()中。对于替代解决方案(以及更新的更完整解决方案),请参阅@JohnCappelletti的答案。

答案 1 :(得分:2)

Declare @Table table (RowNumber int,Increment int,score int)
Insert into @Table values
(1,1,NULL),
(2,100000,NULL ),
(3,-1,NULL), 
(4,1,NULL), 
(5,10,NULL), 
(6,-1,NULL), 
(7,-100000,NULL),
(8,-10,NULL)

Update @Table Set Score=B.Score
 From  @Table A 
 Join (Select RowNumber,Score=sum(Increment) over (order by RowNumber) from @Table) B
  on  A.RowNumber=B.RowNumber

Select * from @Table

OR

UPDATE @Table SET Score=(SELECT SUM(Increment) 
                          FROM  @Table B 
                          WHERE  b.RowNumber <= A.RowNumber)
FROM @Table A 

返回

  RowNumber Increment       score
    1           1           1
    2           100000      100001
    3           -1          100000
    4           1           100001
    5           10          100011
    6           -1          100010
    7           -100000     10
    8           -10         0

答案 2 :(得分:1)

感谢来自HABO的指针,帮助我找到关于运行总和的先前问题。 janderssons reply中与前一个问题的链接引导我找到适合我的解决方案:

声明@runningtotal int set @runningtotal = 0

更新#TempTable3设置@runningtotal =得分= @runningtotal +增量

来自#TempTable3

再次感谢HoneyBadger JohnCappelletti和我一起坚持,我确定错误可能是我的。