2016-10-07 93 views
1

我有一個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 我也有像「部分完成」和「要求」等在此列其他狀態值我只想得到那些只有待定狀態且沒有「完成」狀態的項目。

回答

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') 
+0

這就是我一直在尋找的。謝謝 – user1764351

+0

檢查別名。 – Serg

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

試試這個腳本:這算項目,其狀態僅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 
1

一種方法是NOT EXISTS

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