【问题标题】:Populating a column with calculated values from another column in T-SQL用 T-SQL 中另一列的计算值填充一列
【发布时间】:2016-06-29 11:56:50
【问题描述】:

我有一个临时表 (#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

【问题讨论】:

  • 您要查找的内容称为运行总和。尝试更多搜索,例如[tsql] running sum.

标签: sql-server tsql sum insert-update


【解决方案1】:
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

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

【讨论】:

  • 您好 John - 感谢您的及时回复,我在上面尝试了您的解决方案,并根据需要替换了我的表名,但收到消息“'order' 附近的语法不正确。”我尝试将您的粘贴到一个干净的查询窗口中并按原样运行并得到相同的消息。不确定是否相关,我在 T-SQL 中? MS SQL 短信 2008 R2
  • 什么版本的 SQL 2008+ ?
  • @Table 有 3 个,你三个都做了吗?
  • 版本信息... Microsoft SQL Server Management Studio 10.50.6000.34 Microsoft Analysis Services 客户端工具 10.50.6000.34 Microsoft 数据访问组件 (MDAC) 6.1.7601.17514 Microsoft MSXML 3.0 4.0 6.0 Microsoft Internet Explorer 9.0.8112.16421 Microsoft .NET Framework 2.0.50727.5485 操作系统 6.1.7601
  • 不用担心。事实证明,2008 年支持 OVER 子句,但不支持 SUM() OVER。干杯
【解决方案2】:

类似:

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

应该做的伎俩。见here

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

【讨论】:

  • 恕我直言 - 应该需要评论才能投票 - 即使保持匿名
  • 您好 HoneyBadger,感谢您的回复。像 John Cappelletti 的解决方案一样,我也得到了“'order' 附近的语法错误”。尝试您的消息时发送消息?
  • 你的sql server版本应该支持这个语法。你能告诉我更多关于错误信息的信息吗?
  • 完整的错误信息是“Msg 102, Level 15, State 1, Line 2 Incorrect syntax near 'order'。” - 没有什么可以补充的了 - 抱歉。
  • 你能把rownumber放在括号里吗? ([]) (见编辑) rownumber 也是一个函数...
【解决方案3】:

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

声明@runningtotal int set @runningtotal = 0

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

来自#TempTable3

再次感谢 HoneyBadger JohnCappelletti 对我​​的坚持,我敢肯定错在我。

【讨论】:

  • 如果不指定明确的顺序,SQL Server 可以按任何顺序更新行。像 John Cappeletti 这样的解决方案确保根据正确的行计算总和。根据您使用的 SQL Server 版本,LAG 可能有用。 (如果您同时使用软件和版本标记数据库问题,这会有所帮助,例如sql-server-2014。)
猜你喜欢
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
相关资源
最近更新 更多