2015-01-15 8 views
-2

날짜가있는 일부 행과 날짜가있는 일부 행은 있지만 나머지 필드는 null 인 테이블이 있습니다. make와 판매 가격에 누락 된 값을 채우는 데 가장 효율적인 SQL 스크립팅을 찾으려면 다른 null 값이 변경되지 않도록해야합니다 (가격 변경 참고). null 값을 포함하는 행에 대해 동일한 make와 price를 원합니다.Null 값 채우기 SQL

테이블이 어떻게 생겼는지의 예 : 예상 출력의

Sale_Dates | Make | Sale_Price | Year | Color 
2015-01-01 | Ford | 20000.00 |2012 | Blue 
2015-01-02 | NULL | NULL  |NULL | NULL  
2015-01-03 | NULL | NULL  |NULL | NULL 
2015-01-04 | Ford | 30000.00 |NULL | NULL 
2015-01-05 | NULL | NULL  |NULL | NULL 

예 :

Sale_Dates | Make | Sale_Price | Year | Color 
2015-01-01 | Ford | 20000.00 |2012 | Blue 
2015-01-02 | Ford | 20000.00 |NULL | NULL  
2015-01-03 | Ford | 20000.00 |NULL | NULL 
2015-01-04 | Ford | 30000.00 |NULL | NULL 
2015-01-05 | Ford | 30000.00 |NULL | NULL 
+3

DBMS의 선택! – dario

+0

누락 된 값은 어디에서 가져 오나요? – Eilidh

+1

다른 사용자가 테이블을 만들면 첫 번째 섹션에서 볼 수있는 테이블보기를 만들기 위해 교차 조인을했습니다. 그래서 출력물을 가지고 작업해야합니다. row_number를 사용하여 순위를 만들려고했지만 아무 것도 이끌지 못했습니다. – User214122114

답변

0

CURSOR이 시점에서, 성능 단점이 있지만 그것의 더 나은 당신은 당신이 필요 다른 CURSOR 사용할 수 있습니다 각 레코드에 대해 NOT NULL 값을 확인하십시오. 이것을 사용하는 동안 변수에 마지막으로 NOT NULL 값을 유지할 수 있습니다.

참고 : 귀하의 데이터베이스가 SQL SERVER이 되길 바래요.

SAMPLE 표

CREATE TABLE #TEMP(Sale_Dates DATE,MAKE VARCHAR(30),Sale_Price NUMERIC(18,2),[YEAR] INT,[COLOR] VARCHAR(20)) 

INSERT INTO #TEMP 
SELECT '2015-01-01' , 'Ford' , 20000.00 ,2012 , 'Blue' 
UNION ALL 
SELECT '2015-01-02' , NULL , NULL  ,NULL , NULL  
UNION ALL 
SELECT '2015-01-03' , NULL , NULL  ,NULL , NULL 
UNION ALL 
SELECT '2015-01-04' , 'Maruti' , 30000.00 ,NULL , NULL 
UNION ALL 
SELECT '2015-01-05' , NULL , NULL  ,NULL , NULL 

QUERY 당신이 코멘트에 row_number을 언급 한 이후

DECLARE @Sale_Dates DATE 
DECLARE @MAKE VARCHAR(30) 
DECLARE @Sale_Price NUMERIC(20,2)=0 
DECLARE @Previous_MAKE VARCHAR(30) 
DECLARE @Previous_Sale_Price NUMERIC(20,2)=0 

-- Here you declare which all columns you need to loop in Cursor 
DECLARE CUR CURSOR FOR 
SELECT Sale_Dates,MAKE,Sale_Price 
FROM #TEMP 
ORDER BY Sale_Dates; 

OPEN CUR 

-- Loop starts from here and selects each Seq and Amount of each record in each loop 
FETCH NEXT FROM CUR INTO @Sale_Dates,@MAKE,@Sale_Price 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    -- Updates with previous NOT NULL value 
    IF(@MAKE IS NULL) 
    BEGIN 
     UPDATE #TEMP SET MAKE = @Previous_MAKE 
     WHERE Sale_Dates = @Sale_Dates 
    END 

    -- Updates with previous NOT NULL value 
    IF(@Sale_Price IS NULL) 
    BEGIN 
     UPDATE #TEMP SET Sale_Price = @Previous_Sale_Price 
     WHERE Sale_Dates = @Sale_Dates 
    END 

    -- Store previous NOT NULL value 
    IF(@MAKE IS NOT NULL) 
    BEGIN 
     SET @Previous_MAKE = @MAKE 
    END 

    -- Store previous NOT NULL value 
    IF(@Sale_Price IS NOT NULL) 
    BEGIN 
     SET @Previous_Sale_Price = @Sale_Price 
    END 

    -- Fetches next record and increments the loop 
    FETCH NEXT FROM CUR INTO @Sale_Dates,@MAKE,@Sale_Price 
END 

CLOSE CUR; 
DEALLOCATE CUR; 
+2

창 기능이 여기에서 훨씬 잘 수행됩니다. –

1

난 당신이 window functions을 가정합니다. (모든 현대 RDBMS는 MySQL을 제외하고, 그것들을 가지고 있습니다.) 그럼 간단한 해결책이있다 :

SELECT sale_date 
    , max(make)  OVER (PARTITION BY grp) AS make 
    , max(sale_price) OVER (PARTITION BY grp) AS sale_price 
    , year, color 
FROM (
    SELECT *, count(make) OVER (ORDER BY sale_date) AS grp 
    FROM tbl 
    ORDER BY sale_date 
    ) sub; 

가정 중 하나 모두makesale_price 또는 NULL 또는 모두이 NULL이 아니다.

SQL Fiddle (Postgres 용)

더 설명 :