您好我有以下表格:
让我们说今天的日期是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
答案 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;开始,您在技术上不需要使用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
获取每个部分:
{{1}}