[英]Need to count certain rows based on date criteria in SQL Server
我正在使用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结束日期的组织,我不知道为什么。 ORG_ID 3098376在我的结果中,但是如果我查看该ORG_ID的所有行,则如下所示:
select *
from ##PLCMT
where org_id = '3098376'
结果:
ORG_ID结束日期
3098376 2017-09-11
3098376 NULL
3098376 NULL
使用group by
并having
and 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
具有时间成分,此方法也有效。
另一种方法是使用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)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.