簡體   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