2014-12-04 54 views
0

我有一個名爲「BBSEC2013_REPORTS」的表,其中「Q19_MARKETING」列中的某些值爲NULL。我想要的是用主表中的前一個「Q1_UNIT_SERIAL_NO」值更新這些空值。如何通過同一個表中的上一條記錄更新空值?

SQL:

FIND NULLS上一頁UNIT

SELECT R.Q19_MARKETING FROM BBSEC2013_REPORTS R 
WHERE R.BOOK_ID = * BOOK_ID OF SQL-1 
AND R.Q1_UNIT_SERIAL_NO = * DECREMENT VALUE OF "Q1_UNIT_SERIAL_NO" OF SQL-1 
ORDER R.BY BOOK_ID, R.QUESTIONNARIE_ID,R.Q1_UNIT_SERIAL_NO 

SELECT R.BOOK_ID, R.QUESTIONNARIE_ID, R.Q1_UNIT_SERIAL_NO ,  R.Q19_MARKETING 
FROM BBSEC2013_REPORTS R 
WHERE (R.Q19_MARKETING = 9 OR R.Q19_MARKETING is null) 
AND F_TO_NUMBER(SUBSTR(R.Q6_IND_CODE_CLASS_CODE,1,2)) BETWEEN 10 AND 33 
ORDER BY R.BOOK_ID, R.QUESTIONNARIE_ID, R.Q1_UNIT_SERIAL_NO 

選擇值UPDATING

UPDATE BBSEC2013_REPORTS 
SET Q19_MARKETING= Q19_MARKETING OF SQL-2 
WHERE BOOK_ID = * BOOK_ID OF SQL-1 
AND Q1_UNIT_SERIAL_NO = * Q1_UNIT_SERIAL_NO OF SQL-1 

enter image description here

+1

你是什麼以前Q1_UNIT_SERIAL_NO是什麼意思?你的鍵盤有什麼問題?大寫郵件被認爲是大喊大叫。 – 2014-12-04 07:10:21

+0

Q1_UNIT_SERIAL_NO是表格列名...在圖像中查找第1行。對於Q1_UNIT_SERIAL_NO = 081,營銷結果爲空。我想填寫前一個Q1_UNIT_SERIAL_NO = 080的空值市場價值 – 2014-12-04 07:20:53

+0

Q1_UNIT_SERIAL_NO = 080和081的BOOK_ID和QUESTIONNAIRE_ID是否相同? – 2014-12-04 07:24:05

回答

1

您應該能夠將提供的DML語句組合成一個例如

UPDATE bbsec2013_reports r 
SET r.q19_marketing = 
    (SELECT r1.q19_marketing 
    FROM bbsec2013_reports r1 
    WHERE r1.book_id = r.book_id 
    AND r1.q1_unit_serial_no = to_char(to_number(r.q1_unit_serial_no)-1, 'FM000')) 
WHERE ( r.q19_marketing = 9 
     OR r.q19_marketing IS NULL) 
AND f_to_number(substr(r.q6_ind_code_class_code, 1, 2)) BETWEEN 10 AND 33 

編輯),或者如果遞減,如果沒有必要1:

UPDATE bbsec2013_reports r 
SET r.q19_marketing = 
    (SELECT max(r1.q19_marketing) KEEP (DENSE_RANK LAST ORDER BY r1.q1_unit_serial_no) 
    FROM bbsec2013_reports r1 
    WHERE r1.book_id = r.book_id 
    AND r1.q1_unit_serial_no < r.q1_unit_serial_no) 
WHERE ( r.q19_marketing = 9 
     OR r.q19_marketing IS NULL) 
AND f_to_number(substr(r.q6_ind_code_class_code, 1, 2)) BETWEEN 10 AND 33 

現在你可以添加額外的WHERE從句的子查詢,如果需要例如r1.q19_marketing <> 9 AND r1.q19_marketing IS NOT NULL找到有效的q19_marketing值的前一條記錄。

+0

謝謝你,我明白了:)但是,如果不減少1,我想在q1_unit_serial_number上運行一個循環來查找以前的有效數據,這會是什麼想法? – 2014-12-04 09:40:19

+0

@ rimon.ekjon請參閱編輯 – DrabJay 2014-12-04 10:38:55

0

(發佈代表OP)。

我得到了這個解決方案:

DECLARE 
V_MARKETING NUMBER; 

BEGIN 

FOR X IN (SELECT QUESTIONNARIE_ID FROM BBSEC2013_REPORTS 
     WHERE Q6_IND_CODE_CLASS_CODE < 3400 
     AND (Q19_MARKETING IS NULL OR Q19_MARKETING=9) 
     ) 

LOOP 
    SELECT Q19_MARKETING 
    INTO V_MARKETING 
    FROM BBSEC2013_REPORTS 
    WHERE QUESTIONNARIE_ID=(SELECT MAX(QUESTIONNARIE_ID) 
          FROM BBSEC2013_REPORTS 
          WHERE QUESTIONNARIE_ID < X.QUESTIONNARIE_ID 
          AND Q6_IND_CODE_CLASS_CODE<3400 
          AND (Q19_MARKETING IS NOT NULL OR Q19_MARKETING!=9) 
          ); 

    IF V_MARKETING > 0 THEN 

     UPDATE BBSEC2013_REPORTS 
     SET Q19_MARKETING = V_MARKETING 
     WHERE QUESTIONNARIE_ID = X.QUESTIONNARIE_ID; 

    END IF; 

    COMMIT; 

END LOOP; 

END;