2017-03-31 25 views
0

我想在SQL Server中查找標記爲已完成但不經過已解決狀態的記錄。在SQL Server中選擇完成而不會解決狀態的記錄

下面是以下示例。

tracking_id task_id task status old_status new_status_id 
1195372  140717 ABC Complete NULL  NULL 
1195373  140717 ABC Complete NULL  New 
1195374  140717 ABC Complete New  Completed 
1195380  140718 XYZ Complete NULL  NULL 
1195381  140718 XYZ Complete NULL  New 
1195382  140718 XYZ Complete New  Completed 
1195383  140719 PQR Complete NULL  NULL 
1195384  140719 PQR Complete NULL  Resolved 
1195385  140719 PQR Complete Resolved Completed 
在表

現在,作爲TASK_ID 140717和140718被標記爲完成,但它從來沒有解決陳述。其中task_id 140719也被標記爲完成,但它經歷了狀態已解決。所以我想寫SQL查詢先手紀錄TASK_ID 140717和140718.

與如何編寫查詢這個可以理解的任何幫助。

+0

是更好,如果你告訴我們,你有什麼願望的結果在同一個表格式的涉及。您是否希望'{140717,140718}'或具有完整或全部行的行以及您不需要檢查新狀態的那些ID –

回答

2

使用NOT EXISTS像這樣:

select * 
from yourtable t 
where status = 'Complete' 
and not exists 
    (select top 1 1 
     from yourtable o 
     where o.task_id = t.task_id 
     and o.old_status = 'Resolved') 
0
select * from mytable 
where new_status_id = 'Completed' 
     and old_status <> 'Resolved' 
1

如果old_status_id並不總是'resolved''completed'然後使用not exists()

select * 
from t 
where new_status_id = 'completed' 
    and not exists (
    select 1 
    from t as i 
    where i.task_id = t.task_id 
     and i.new_status_id = 'resolved' 
) 
0

您應該按照有關SELECT語句的一些導遊,因爲這是非常基本的語法。

只需使用一些where子句:

SELECT * 
FROM Table 
WHERE old_status !+ 'Resolved' 
AND new_status_id = 'Completed' 
3

這樣做是爲了確保任務ID具有「已完成」的記錄,但不是「已解決」的紀錄。

select ... 
from the_table t_outer 
where 
    status = 'Completed' and 
    not exists (
    select 1 from the_table t_inner 
    where 
     t_inner.task_id = t_outer.task_id and -- same task 
     'Resolved' in (t_inner.old_status, t_inner.new_status) 
) 

(全狀態/ NEW_STATUS/OLD_STATUS事情感覺凌亂。)

+0

。只有對於任何old_status,最後的狀態是「Completed」 –

1

我猜你只需要task_id不是行?

SELECT task_id 
FROM yourTable 
GROUP BY task_id 
HAVING COUNT(CASE WHEN old_status = 'Resolved' THEN 1 END) = 0 
    AND COUNT(CASE WHEN new_status_id = 'Completed' THEN 1 END) = 1 

現在如果你想所有的紀錄在那些「不完整」的任務

WITH cte as (
    SELECT task_id 
    FROM yourTable 
    GROUP BY task_id 
    HAVING COUNT(CASE WHEN old_status = 'Resolved' THEN 1 END) = 0 
     AND COUNT(CASE WHEN new_status_id = 'Completed' THEN 1 END) = 1 
) 
SELECT * 
FROM yourTable Y 
JOIN cte C 
    ON Y.task_id = C.task_id