2016-09-21 38 views
0

我有一张表,其中包含DocIds,Tasks,StartDate和EndDate的列表,如图所示。我需要构建一个只返回DocIds的查询,其中'任务A'具有NOT NULL EndDate,并且没有其他任务。只有其他值存在时检索不同的值

+-------+------+-----------+----------+ 
| DocId | Task | StartDate | EndDate | 
+-------+------+-----------+----------+ 
|  1 | A | 1/1/2017 | 1/1/2017 | 
|  2 | A | 1/1/2017 | 1/2/2017 | 
|  2 | B | 1/2/2017 | 1/3/2017 | 
+-------+------+-----------+----------+ 

如果这是我整个表,查询将只从第一行返回的docId,因为它是一个只有它有一个结束日期任务A一docID的,没有任务B.

我已经开始用类似如下:

SELECT DISTINCT DocId 
    FROM WorkTasks 
    WHERE [Task] = 'A' 
    AND EndDate IS NOT NULL 
    -- AND TASK(B..C..D..etc) DOES NOT EXIST 

我无法理解如何指定额外的任务没有为给定的docId存在。额外的任务是任意命名,所以我需要在DocId排除具有比A项任务以外的DocID的任何实例

回答

3

集团只拿那些只有一个任务与没有其他条件比你提到的

SELECT DocId 
FROM WorkTasks 
GROUP BY DocId 
HAVING count(distinct [Task]) = 1 
    AND sum(case when [Task] <> 'A' OR EndDate IS NULL then 1 else 0 end) = 0 
相关问题