2015-11-04 103 views
0

我试图想出一个查询,它将列出所有的task_groups,其中组中的所有task_name由'AUTO'用户执行,除了'Initial '这将是手动的任务。 所以对于下面的数据,我应该只看到Task_Group“1”的结果,而不是Task_Group“2”SQL查询获取一个值,但只有一行匹配

CREATE TABLE [dbo].[QUERY_TST](
    [ID] [int] IDENTITY(1,1) PRIMARY KEY, 
    [TASK_GROUP] [int] NOT NULL, 
    [TASK_NAME] [varchar](50) NULL, 
    [PERFORMED_BY] [varchar](10) NULL 
) 
--Data 
INSERT INTO QUERY_TST VALUES(1, 'INITIAL', 'MANUAL') 
INSERT INTO QUERY_TST VALUES(1, 'TASK1', 'AUTO') 
INSERT INTO QUERY_TST VALUES(1, 'TASK2', 'AUTO') 
INSERT INTO QUERY_TST VALUES(1, 'TASK3', 'AUTO') 

INSERT INTO QUERY_TST VALUES(2, 'INITIAL', 'MANUAL') 
INSERT INTO QUERY_TST VALUES(2, 'TASK1', 'AUTO') 
INSERT INTO QUERY_TST VALUES(2, 'TASK2', 'MANUAL') 
INSERT INTO QUERY_TST VALUES(2, 'TASK3', 'AUTO') 
+0

是''除了和Manual''Auto' Performed_By'还有其他可能的值? – Moho

回答

0

这应该给你你以后:

SELECT DISTINCT 
    task_group 
FROM query_tst As a 
WHERE (
    (NOT EXISTS (
     SELECT NULL 
     FROM query_tst As b 
     WHERE (
      (a.task_group = b.task_group) And 
      (b.task_name <> 'Initial') And 
      (b.performed_by <> 'AUTO') 
     ) 
    )) 
); 
+0

这一个不工作,因为不检查是否有''初始'='手动'' –

+0

这工作正常。该操作说明我们关心的不是'Initial'的task_names,它们已经由'Manual'用户完成。 – Yllzarith

0
  • 所有任务少一个是由AUTO
  • 执行的初始任务是通过MANUAL
perfomen

select [TASK_GROUP] 
from [dbo].[QUERY_TST] 
GROUP BY [TASK_GROUP] 
HAVING SUM(CASE WHEN [PERFORMED_BY] = 'AUTO' AND [TASK_NAME] <> 'Initial' THEN 1 
      ELSE 0 END) = COUNT(*)-1 
    AND SUM(CASE WHEN [PERFORMED_BY] = 'MANUAL' AND [TASK_NAME] = 'Initial' THEN 1 
      ELSE 0 END) = 1 
0

你可以这样说:

select * 
from query_tst as t1 
where 
    TASK_NAME = 'initial' 
    and not exists (
    select 1 
    from query_tst as t2 
    where t1.TASK_GROUP = t2.TASK_GROUP 
    and TASK_NAME <> 'initial' 
    and PERFORMED_BY = 'manual' 
) 

这里展现它的工作小提琴:http://sqlfiddle.com/#!3/f9aa8/5

相关问题