在满足值时排除行

时间:2016-03-16 17:19:30

标签: sql

我需要过滤我的结果,以便我只有JOBSTATUS正在等待的生产订单。或者' STARTED'。我不想要任何其他类型的工作状态。因此,例如,如果生产订单的作业状态为ENDED,我想从结果中排除该生产订单。

PT.PRODID (Production Order)
PT.JOBNUM (JOB NUMBER)
PRJ.JOBID (Job Identification)
PRJ.JOBSTATUS (Job Status)

Status: 

0 - Coming
1 - Waiting
2 - Started
4 - Ended

正如我所提到的,我拥有所需的所有数据,但我不知道如何进一步过滤它。

我的尝试只是过滤掉已经ENDED的工作状态。我想要排除任何作业状态为ENDED的生产订单。

所以我的结果应该是这样的:

PT.PRODID    PT.Jobnum        PRJ.JOBID        PRJ.JOBSTATUS
ABC            10               9876               WAITING
ABC            20               5432               STARTED
ABC            30               1098               WAITING
ABC            40               7654               WAITING
ABC            50               3210               STARTED

这是我到目前为止的代码:

SELECT
         PRJ.PRODID 'Prod #'
        ,PRJ.OprNum 'Oper #'
        ,PRJ.JOBID 'Job #'
        ,PRJ.WRKCTRID 'Resource'
        -- Assign JOBSTATUS int to String value
            ,(Case PRJ.JOBSTATUS
                WHEN '1' THEN 'Waiting'
                WHEN '2' THEN 'Coming'
                WHEN '3' THEN 'Started'
                WHEN '4' THEN 'Ended'
                Else 'No Data'
                END) 'JobStatus'
        ,PRJ.FROMDATE 

FROM
    PRODROUTEJOB AS PRJ
        JOIN PRODTABLE AS PT ON PRJ.PRODID = PT.PRODID

        WHERE PT.PRODSTATUS = '4'--Show only Production orders that are STARTED
                AND PRJ.JOBTYPE = '2' -- Filter only for jobs that are PROCESS and not QUEUE BEFORE 

我需要的结果是生产订单PT.PRODID,其不具有(4)-ENDED或(1)-COMING的作业状态PRJ.JOBID。如果作业状态具有这些状态之一,则从结果中排除生产编号和所有作业状态行。

1 个答案:

答案 0 :(得分:0)

从您的问题中不清楚您的最终查询应该是什么样子,但可以使用HAVING子句根据聚合进行过滤:

SELECT JOBID 
FROM Projects
GROUP BY JOBID 
HAVING MAX(Status) < 4

我假设每个作业有多行,具有不同的状态值,因此聚合将允许您过滤到跨行的特定状态永远不会出现的作业。

如果Status实际上不是4而是Ended,那么您可以在HAVING子句中使用条件聚合:

SELECT JOBID 
FROM Projects
GROUP BY JOBID 
HAVING MAX(CASE WHEN Status = 'Ended' THEN 1 ELSE 0 END) = 0