2017-12-19 16 views
1

を新しい値に到達するまで上記の値から列の値を入力して、私は次のように記入の値を持つテーブルを持っている:私はいっぱいになり、トリガーを追加する必要がそれがSQL Serverで現在

Current Table

挿入時の値は、その最終的な結果は次のようになります。

End Goal

プロセスはあなたが値を下にドラッグExcelで類似しています。しかし、新しい価値観を打つ前にそれを止めて、プロセスをやり直す必要があります。

ただし、次の値がないことがあります。終了がない場合、どうすれば更新を停止できますか?

答えて

1

これは、2つの相関サブクエリで実行できます。

create table #YourTable (RowNumber int identity(1,1), [Value] int null) 
insert into #YourTable 
values 
(10), 
(null), 
(null), 
(null), 
(null), 
(null), 
(null), 
(null), 
(20), 
(null), 
(null), 
(null), 
(null), 
(30), 
(null), 
(40), 
(null), 
(null), 
(50) 


select 
    t.RowNumber 
    ,OldVal = t.Value 
    ,NewVal = case 
        when t.[Value] is null 
         then (select t3.[Value] 
           from #YourTable t3 
           where t3.RowNumber = (select max(RowNumber) 
                from #YourTable t2 
                where t2.RowNumber < t.RowNumber and t2.Value is not null) 
          ) 
        else [Value] 
       end 
from #YourTable t 
order by 
    t.RowNumber 

drop table #YourTable 

テーブルを更新する場合は、これを行う方法があります(新しいテストデータ)。

create table #YourTable (RowNumber int identity(1,1), [Value] int null) 
insert into #YourTable 
values 
(10), 
(null), 
(null), 
(null), 
(5), 
(null), 
(null), 
(null), 
(20), 
(null), 
(15), 
(null), 
(null), 
(30), 
(null), 
(40), 
(null), 
(null), 
(50), 
(null), 
(null) 

update t 
set [Value] = case 
        when t.[Value] is null 
         then (select t3.[Value] 
           from #YourTable t3 
           where t3.RowNumber = (select max(RowNumber) 
                from #YourTable t2 
                where t2.RowNumber < t.RowNumber and t2.Value is not null) 
          ) 
        else [Value] 
       end 
from #YourTable t 


select * from #YourTable order by RowNumber 

あなたがテーブルを更新したら、その後、あなたのINSERT文がちょうど価値はあなたがIS NULLを挿入したりしていないかどうかを確認する必要があり、それがある場合、最後の値に設定します。それは、...

ここでは、我々は以下のNULLを挿入されていないので、挿入された値が実際に50が、その後、最後のテストテーブル

declare @valToInsert int = null 
insert into #YourTable 
select case when @valToInsert is null then (select top 1 [Value] from #YourTable order by RowNumber desc) else @valToInsert end 

をオフに基づいて行われますので、NULLを挿入し、このようなものです実際の値を挿入します

declare @valToInsert int = 14 
insert into #YourTable 
select case when @valToInsert is null then (select top 1 [Value] from #YourTable order by RowNumber desc) else @valToInsert end 
+0

あなたの回答は私のところに途中まで届きました。あなたのコードを実装しようとしましたが、いくつかのヌル値を間違ったデータで上書きすることに気付きました。これらのヌル値が100%正確であることを確認する必要があります。 – AlanPear

+0

私の更新を見てください – AlanPear

+0

あなたは最初の列に対してまったく異なる値を設定しました。この列のACTUALデータは何ですか?あなたがあなたの編集で説明したように "セット"を決定するのは何ですか?行の最初の文字ですか?あなたは具体的にする必要があります。元の答えは元の質問には完璧でした。 – scsimon

関連する問題