ORACLE基于两列

时间:2016-10-07 09:32:28

标签: sql database oracle

我有一个Oracle数据库表

我在这个特定的表中有很多列,但我想根据两列之间的计算得到结果,如下所述

Project|Status
-------|--------
 1     | Done    
 1     | Pending
 2     | Done

我想了解待处理项目的数量,例如,如果项目1的状态为挂起状态,并且它在表中的任何位置都没有完成状态,那么它将是待处理任务,但如果项目1具有待处理状态,在任何其他行的表中也有一个完成状态,那么这将不是一个挂起的任务,

我已经尝试过这个查询,但它返回的是具有挂起和完成状态的行,

SELECT * FROM MYTABLE T 
WHERE EXISTS
(SELECT 1 FROM MYTABLE WHERE Project = A.Project AND ROWID < A.ROWID AND            
Status ='Done') 
AND T.Status!='Done' AND T.Status='Pending'

@Update   我还在此列中有其他状态值,如“部分完成”和“请求”,因此我只想获得那些只有待处理状态且整个表中没有“完成”状态的项目。

4 个答案:

答案 0 :(得分:2)

您可以使用HAVINGGROUP BY

执行此操作
SELECT
    Project
FROM MyTable t
GROUP BY Project
HAVING
    -- Should have at least one Pending status
    SUM(CASE WHEN Status = 'Pending' THEN 1 ELSE 0 END) > 0 
    -- No other status aside from Pending
    AND SUM(CASE WHEN Status <> 'Pending' THEN 1 ELSE 0 END) = 0

答案 1 :(得分:1)

尝试此脚本:这将计算其状态仅为Pending

的项目
SELECT Project,COUNT(Project) 
FROM MYTABLE t1 
WHERE NOT EXISTS(SELECT 1 FROM MYTABLE t2 WHERE t2.Project = t1.Project AND T2.Status='Done') 
AND t1.Status='Pending' 
GROUP BY Project 

答案 2 :(得分:1)

如果您想要获取待处理的项目且没有其他状态为“完成”,请使用以下查询。

SELECT * FROM MYTABLE T 
WHERE T.Status='Pending'
AND NOT EXISTS --excluding projects with 'done' status
(SELECT 1 FROM MYTABLE A WHERE A.Project = T.Project AND         
A.Status ='Done') 

如果您想获得总计待处理项目的数量,请使用以下脚本。

 SELECT COUNT(*) FROM MYTABLE T 
 WHERE T.Status='Pending'
    AND NOT EXISTS
    (SELECT 1 FROM MYTABLE A WHERE A.Project = T.Project AND         
    A.Status ='Done') 

答案 3 :(得分:1)

一种方式是不存在

SELECT * FROM MYTABLE T 
WHERE NOT EXISTS
   (SELECT 1 
    FROM MYTABLE T2 
    WHERE T2.Project = T.Project AND T.ROWID < T2.ROWID 
         AND T2.Status ='Done') 
AND Status='Pending'

AND T.ROWID < T2.ROWID不确定。我最好使用一个日期时间列,指示状态的日期变为实际日期。此外,根据您的任务,它可以颠倒AND T.ROWID > T2.ROWID