2017-12-19 13 views
1

현재 SQL Server의 새로운 가치를 돌 때까지 위의 값에서 열 값을 채우고,이 같은 채워 값이있는 테이블이 삽입의 값은, 그래서 최종 결과는 다음과 같습니다

End Goal

과정은 당신이 값을 아래로 드래그 엑셀에서 유사하다. 그러나 새로운 가치에 부딪치기 전에 중단하고 다시 프로세스를 시작해야합니다.

그러나 때때로 다음 값이 없을 수도 있습니다. 끝이 없으면 업데이트를 어떻게 중지합니까?

답변

1

상관 관계가있는 두 개의 하위 쿼리로이 작업을 수행 할 수 있습니다. 여기

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 

는 테이블이 업데이트되면, 다음 삽입 문은 값이 IS NULL를 삽입하거나하지 않을 경우 확인해야하며이 경우, 마지막 값으로 설정합니다. 즉, 우리가 아래 NULL를 삽입되지 않기 때문에 여기에

우리가하는 NULL 따라서 삽입 된 값이 실제로 그런 다음 마지막 테스트 테이블

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 

을 기반으로 50됩니다 삽입 ...이 같은 것 실제 값을 삽입 할 것입니다

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

귀하의 답변은 중간에 있습니다. 귀하의 코드를 구현하려하지만 잘못된 데이터로 일부 null 값을 덮어 쓰는 것을 발견했습니다. 이러한 null 값이 100 % 정확해야합니다. – AlanPear

+0

내 업데이트를 확인하십시오 – AlanPear

+0

방금 ​​첫 번째 열에 대해 완전히 다른 값을 구성했습니다. 이 열에 대한 실제 데이터는 무엇입니까? 편집에서 설명한대로 "집합"을 결정하는 것은 무엇입니까? 행의 첫 글자? 등 ... 당신은 구체적이어야합니다. 원래의 대답은 원래의 질문에 완벽했습니다. – scsimon