2016-09-08 59 views
0

您好我有如下表:如何拾了基於第二列的記錄爲空

比方說今天的​​日期是01月-2016

ID Change_Dt Cancel_Dt 
1 1/1/2015 NULL  
2 1/1/2015 1/1/2015  
3 1/1/2015 2/1/2015 
3 3/1/2015 NULL  
4 1/1/2015 12/1/2015 
4 1/1/2016 9/1/2016 
4 10/1/2016 NULL  
5 10/1/2016 NULL  
6 9/1/2016 9/1/2016  
7 1/1/2015 NULL 
7 1/1/2016 9/1/2016 

要求:如果所有記錄,如果有是用於ID ATLEAST一個記錄,其中Change_Dt < =今天的日期和Cancel_Dt爲Null 則Y 別的ñ

所需的結果:

ID Results Change_Dt Cancel_Dt 

1 Y   1/1/2015 NULL 
2 N   1/1/2015 1/1/2015 
3 Y   3/1/2015 NULL 
4 N   10/1/2016 NULL 
5 N   10/1/2016 NULL 
6 N   9/1/2016 9/1/2016 
7 Y   1/1/2015 NULL 

對此的任何幫助都會很棒。

我的代碼,我想:

select m.ID, 
Case when(m.Cancel_Dt is null and m.Create_Dt < = '01-SEP-2016') 
    then 'Y' 
    else 'N' 
end Indicators 

from mytable m 
+0

嘛,你嘗試過什麼? – OldProgrammer

+0

但我的代碼給我我的每個記錄的結果 – Qasim0787

回答

3

你可以使用你的小變化寫的情況。在CASE上使用MAX,在另一個CASE內將允許您選擇正確的值。

SELECT ID, 
    CASE WHEN 
     MAX(case when(m.Cancel_Dt is null and m.Create_Dt < = '01-SEP-2016') 
      then 1 
      else 0 
     end) = 1 THEN 'Y' 
    ELSE 'N' 
    END Indicators 
FROM my_records 
GROUP BY ID 

請注意,你不這樣做在技術上需要使用10因爲Y>N然而,這使查詢更清晰的(至少對我來說)。

要獲得所有我將查詢的列,並使用UNION獲得各部分:

SELECT m.id, 
    'Y' as results, 
    MAX(change_dt) as change_dt, 
    NUll as cancel_dt 
FROM my_records m 
WHERE m.Cancel_Dt is null 
AND m.change_dt <= '2016-09-01' 
GROUP BY id 

UNION ALL 

SELECT m.id, 
    'N', 
    MAX(change_dt) as change_dt, 
    MAX(cancel_dt) as cancel_dt 
FROM my_records m 
WHERE (m.Cancel_Dt is not null 
OR m.change_dt > '2016-09-01') 
AND NOT EXISTS (SELECT 1 
    FROM my_records m2 
    WHERE m2.Cancel_Dt is null 
    AND m2.change_dt <= '2016-09-01' 
    AND m2.id = m.id) 
GROUP BY id 
ORDER BY id 
+0

我想拉起相關的change_date和Cancel_date以及。 – Qasim0787

+0

@ Qasim0787請參閱備用查詢 – GavinCattell

相關問題