0

我在 SQL Server 2008 R2 工作。我正在尝试编写一个存储过程,它将创建具有当前成本总和的新列。

我有MyTable

ID     |   Costs
----------------
1      |     5
2      |     3
3      |     2
4      |     4

但我需要第三列“CurrentCosts”的值:

ID     |   Costs   |  CurrentCosts
----------------------------------
1      |     5     |      5
2      |     3     |      8
3      |     2     |      10
4      |     4     |      14
  • 'CurrentCosts' 中的第一个值是:5 + 0 = 5
  • 'CurrentCosts' 中的第二个值是:5 + 3 = 8
  • 'CurrentCosts' 中的第三个值是:8 + 2 = 10
  • 'CurrentCosts' 中的第四个值是:10 + 4 = 14

等等。

我试过:

declare @ID INT
declare @current_cost int
declare @running_cost int

select @ID = min( ID ) from MyTable
set @running_cost = 0
set @current_cost = 0

while @ID is not null
begin
    select ID, Costs, @running_cost as 'CurrentCosts' from MyTable where ID = @ID
    select @ID = min( ID ) from MyTable where ID > @ID
    select @current_cost = Costs from MyTable where ID = @ID
    set @running_cost += @current_cost
end

它有效,但如果有人有更好的解决方案,我将不胜感激。我得到了许多表,每个表只有一个结果,并且与循环中的 SELECT commanad 一样多。是否有一些解决方案,我将只获得一张包含所有结果的表格。

4

2 回答 2

3

您可以使用子查询:

SELECT ID, Costs, 
       (SELECT Sum(Costs) 
        FROM   dbo.MyTable t2 
        WHERE  t2.ID <= t1.ID) AS CurrentCosts 
FROM   dbo.MyTable t1 

演示

ID     COSTS    CURRENTCOSTS
1        5            5
2        3            8
3        2            10
4        4            14
于 2013-07-22T12:11:46.407 回答
0

你可以找到这个有趣的 http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals

于 2013-07-22T12:37:59.977 回答