基于总和更新

时间:2012-06-16 03:52:13

标签: sql sql-server database

我有这个表Test,因为Id, SomeValue, SomeText包含一个工厂记录,我将表改为

ALTER TABLE Test
ADD ComputedColFloat FLOAT

所有都设置为null,很好!我想要的是,对于每一行,ComputedColFloat的值应该设置为列SomeValue到该行的值的总和。 (SomeValue中的值使用RAND()计算!)

比如说,如果在添加列之前,前五行是

Id    SomeValue    SomeText
1     .91          text
2     .34          text
3     .52          text
4     .11          text
5     .68          text

我想要的是编写一个查询来更新表并设置添加的列以反映值

Id    SomeValue    SomeText    ComputedColFloat
1     .91          text        .91   // .91
2     .34          text        1.25  // .91 + .34
3     .52          text        1.77  // .91 + .34 + .52
4     .11          text        1.88  // .91 + .34 + .52 + .11
5     .68          text        2.56  // .91 + .34 + .52 + .11 + .68 

我正在使用sql server 2008,并且更喜欢从SSMS而不是通过C#或任何东西从visual studio执行此操作! (在VS中的C#中,我可以循环,找到总和,然后编写一个更新记录的查询,但这不是我需要的,我需要从SSMS做到这一点)
此外,如果有多种方法可以做到这一点,我想知道什么是最好的性能,因为我有一个磨坊记录,我不想永远等待! :(

3 个答案:

答案 0 :(得分:1)

您可以为表创建游标并更新每一行。

        DECLARE CUR_TEST CURSOR LOCAL For Select ID,SomeValue From test ORDER BY ID ASC
        DECLARE @TOTALSUM FLOAT
                    DECLARE @ID INT
        DECLARE @SOMEMVALUE FLOAT
        OPEN CUR_LOCAL
        SET @TOTALSUM=0
        SET @SOMEVALUE=0
        FETCH CUR_LOCAL INTO @ID,@SOMEVALUE
        WHILE @@FETCH_STATUS = 0 
        BEGIN
            SET @TOTALSUM=@TOTALSUM + @SOMEVALUE
            Update TEST SET ComputedColFloat =@TOTALSUM Where ID=@ID
            FETCH CUR_LOCAL INTO @ID,@SOMEVALUE
        END
        CLOSE CUR_LOCAL
        DEALLOCATE CUR_LOCAL

在执行之前,请复制一份表格进行验证

答案 1 :(得分:1)

这是一个比光标更好的选择:

首先,在第一行中设置第一个值:

update Test set ComputedColFloat = [text] where id = 1

然后,您只需考虑上一行

更新每一行
update t2 set ComputedColFloat = [text] + (select ComputedColFloat from Test  where id = t2.id-1 ) from Test t2  where t2.id > 1

答案 2 :(得分:0)

你可以试试这个:

declare @sumUptoThatRow float,@query varchar(2000),@Id int,@ComputedColFloat float,@updateQuery nvarchar(max)

set @query = 'declare dbcursor cursor for select Id,ComputedColFloat  from test order by id '

set @sumUptoThatRow = 0.00

exec (@query)

open dbcursor

fetch next from dbcursor into @Id,@ComputedColFloat

while @@FETCH_STATUS = 0

begin

set @sumUptoThatRow = @sumUptoThatRow + @ComputedColFloat

--Update 
set @updateQuery = 'Update test set ComputedColFloat = ' + sumUptoThatRow + '  where Id = ' + @Id

exec (@updateQuery)

fetch next from dbcursor into @Id,@ComputedColFloat

end

close dbcursor

deallocate dbcursor