我正在使用SQL Server 2012并拥有一个包含这两列的表。我需要计算ORG_ID一次,如果每行的EndDate或ORG_ID落在' 1-1-2018'的时间范围内/之前和' 1-31-2018' (或之前但不是之后)该组织的所有行。 EndDate为NULL的ORE也不在我的结果中
ORG_ID EndDate
99968042 1/31/2018
99968042 2/14/2018
99968042 2/14/2018
99900699 1/10/2018
99900699 1/10/2018
99900699 1/10/2018
99900699 1/10/2018
99899776 1/20/2018
99843366 12/17/2017
99843366 1/4/2018
99841000 2/1/2016
99651255 NULL
99651255 1/15/2018
应输出的行是:
99900699
99899776
99843366
我没有尝试任何事情,因为我无法思考如何接近它。
所以现在我尝试了这个:
select distinct ORG_ID
from ##PLCMT p1
where not exists (
select *
from ##PLCMT p2
where p1.ORG_ID = p2.ORG_ID and
(p1.EndDate <= '2018-01-01' or p1.enddate >= '2018-01-31' or p1.EndDate is NULL)
)
并且它仍然返回一个具有NULL enddate的组织,我无法弄清楚原因。 ORG_ID 3098376在我的结果中,但如果我查看该ORG_ID的所有行,它看起来像这样:
select *
from ##PLCMT
where org_id = '3098376'
结果:
ORG_ID EndDate
3098376 2017-09-11
3098376 NULL
3098376 NULL
答案 0 :(得分:3)
使用group by
和having
以及NOT IN
(以消除那些具有任何NULL值的人):
SELECT org_id
FROM t
GROUP BY org_id
WHERE org_id NOT IN (SELECT org_id FROM t WHERE enddate IS NULL)
HAVING MAX(enddate) <= '2018-01-31';
这个逻辑可能是安全的:
having max(enddate) < '2018-02-01'
即使enddate
有时间组件,这也有效。
答案 1 :(得分:1)
另一种方法是使用NOT EXISTS()
SELECT DISTINCT org_id
from t
WHERE NOT EXISTS(
SELECT * FROM t t1
WHERE t1.org_id=t.org_id
AND (t1.enddate > '20180131' OR t1.enddate IS NULL)
)