我有一个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 我还在此列中有其他状态值,如“部分完成”和“请求”,因此我只想获得那些只有待处理状态且整个表中没有“完成”状态的项目。
答案 0 :(得分:2)
您可以使用HAVING
和GROUP 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
。