2014-11-04 1 views
1

몇 개의 열이있는 테이블이 있습니다. null을 대체 할 값을 채우고 싶지만 추가 열로 인해이 작업이 복잡합니다. 여기에 내가 무엇을의 샘플은 다음과 같습니다여러 열로 값을 채우기 위해 교차 적용

값이 id1-4의 "그룹"에있는 동안에는 내가 value 아래로 복사 할
date id1 id2 id3 id4 value 
1/1/14 a  1  1  1  1.2 
1/2/14 a  1  1  1  NULL 
1/8/14 a  1  1  1  2.3 
1/1/14 a  2  1  1  10.1 
1/2/14 a  2  1  1  12.3 
1/17/14 a  2  1  1  NULL 
1/18/14 a  2  1  1  10.8 
1/1/14 a  2  3  1  100.3 
1/2/14 a  2  3  1  NULL 
1/6/14 a  2  3  1  110.4 

. 예를 들어, "A-1-1-1"은 모두 "a-2-1-1"에서 어떤 값을 복사해야하는지에 대해 격리되어야합니다. 내가 필요로하는 출력은 : 나는 CROSS APPLY를 사용하여 단일 열 그러나 저를 혼동하는 여러 열에 대한 구문이 작업을 수행 할 수 있습니다

date id1 id2 id3 id4 value 
1/1/14 a  1  1  1  1.2 
1/2/14 a  1  1  1  1.2 
1/8/14 a  1  1  1  2.3 
1/1/14 a  2  1  1  10.1 
1/2/14 a  2  1  1  12.3 
1/17/14 a  2  1  1  12.3 
1/18/14 a  2  1  1  10.8 
1/1/14 a  2  3  1  100.3 
1/2/14 a  2  3  1  100.3 
1/6/14 a  2  3  1  110.4 

. 임시 데이터를 생성하는 SQL은 다음과 같습니다 당신은이에 대한 apply을 사용할 수 있습니다

DECLARE @test TABLE 
    (
    date DATETIME 
    ,id1 VARCHAR(1) 
    ,id2 INT 
    ,id3 INT 
    ,id4 INT 
    ,value FLOAT 
    ) 

    INSERT INTO @test VALUES 
    ('2014-01-01','a','1','1','1','1.2') 
    ,('2014-01-02','a','1','1','1',NULL) 
    ,('2014-01-08','a','1','1','1','2.3') 
    ,('2014-01-01','a','2','1','1','10.1') 
    ,('2014-01-02','a','2','1','1','12.3') 
    ,('2014-01-17','a','2','1','1',NULL) 
    ,('2014-01-18','a','2','1','1','10.8') 
    ,('2014-01-01','a','2','3','1','100.3') 
    ,('2014-01-02','a','2','3','1',NULL) 
    ,('2014-01-06','a','2','3','1','110.4') 
    ; 

    SELECT * FROM @test; 
+0

주문 할 데이터를 필요로한다. 그룹화를 유지하면서 날짜별로 주문하는 것이 허용 가능하다고 가정하는 것이 안전합니까? – Apothis

+0

예, 반드시 주문되었습니다. 다른 쿼리를 사용하여 정렬을 수행하는 임시 테이블을 채 웁니다. –

답변

2

: 그것은 다음과 같습니다

select t.*, coalesce(t.value, tprev.value) as value 
from @test t outer apply 
    (select top 1 value 
     from @test t2 
     where t2.id1 = t.id1 and t2.id2 = t.id2 and t2.id3 = t.id3 and t2.id4 = t.id4 and 
      t2.date < t.date and t2.value is not null 
     order by t2.date desc 
    ) tprev; 
+0

우와, 정말 멋지다! 감사! 나는 이전에'APPLY'를 사용하지 않았습니다. –

+0

하나의 작은 변화를 만들었습니다. 'ORDER BY t2.date DESC'를 추가하여 시리즈의 첫 번째 날짜가 아닌 가장 최근 날짜를 다시 채 웁니다. 그 외에도 이것은 완벽하게 작동합니다! –

+1

@ JeffreyKramer. . . 고맙습니다. –