2014-12-04 59 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;