1

私はこのテーブルを持ってTestおりId, SomeValue, SomeText、約1つのミルレコードが含まれています。テーブルを次のように変更しました

ALTER TABLE Test
ADD ComputedColFloat FLOAT

すべてが に設定されていnullます。私が望むのは、行ごとに、ComputedColFloat の値をSomeValueその行までの列の値の合計に設定する必要があるということです。( の値は!SomeValueを使用して計算されRAND()ます)

たとえば、列を追加する前に、最初の 5 行が

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を使用していますが、C#などのビジュアルスタジオからではなく、SSMSからこれを行うことを好みます! (VSのC#では、ループして合計を見つけてから、レコードを更新するクエリを書くことができますが、それは私が必要とするものではなく、SSMSから行う必要があります)
また、複数の方法がある場合これについては、私は約 1 ミルのレコードを持っているので、パフォーマンスに関して何がベストかを知りたいのですが、永遠に待ちたくありません! :(

4

3 に答える 3

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
于 2012-06-16T04:30:54.477 に答える
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

実行する前に、テーブルのコピーを取得して確認してください

于 2012-06-16T04:04:22.303 に答える
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
于 2012-06-16T04:11:52.407 に答える