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

时间:2018-06-13 15:56:32

标签: sql sql-server sql-server-2012

我正在使用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

2 个答案:

答案 0 :(得分:3)

使用group byhaving以及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)
)
相关问题