如何基于第二列拾取记录为空

时间:2016-09-08 19:51:30

标签: sql oracle oracle11g

您好我有以下表格:

让我们说今天的日期是2016年9月1日

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记录,其中Change_Dt< =今天的日期和Cancel_Dt为空 然后Y. 否则N

所需结果:

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

1 个答案:

答案 0 :(得分:3)

您可以使用您编写的CASE进行一些小改动。在MAX上使用CASE,在另一个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 将允许您选择正确的值。

1

请注意,从0&gt;开始,您在技术上不需要使用YNUNION然而,这使查询更清晰(至少对我而言)。

要获取所有列,我会拆分查询,并使用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 获取每个部分:

{{1}}