我有这个表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做到这一点)
此外,如果有多种方法可以做到这一点,我想知道什么是最好的性能,因为我有一个磨坊记录,我不想永远等待! :(
答案 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