繁体   English   中英

需要根据SQL Server中的日期条件对某些行进行计数

[英]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 byhaving 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM