2012-07-13 44 views
1

我有表T1和T2。SQL從表中減去時間(對於來自第二表的特定時間狀態額外減少)

T1

ID TIME1 TIME2 
1001 1  10 
1002 1  20 

T2

ID  STATUS TIME 
1001  NEW   1 
1001  CLOSED  10 
1002  NEW   1 
1002  HOLD  5 
1002  CLOSED  13 

我想導致TIME2-TIME1如果狀態保持不表T2存在;或TIME2-TIME1-TIME如果狀態保持在表中存在該記錄

1001 9 (10-1) 
1002 14(20-1-5) 

我最初寫的SQL查詢,但是,這並不工作,因爲它返回NULL第一記錄,而對於第二個記錄的結果是OK

SELECT T1.ID,T1.TIME2-T1.TIME1-T2.TIME 
FROM T1 
LEFT OUTER JOIN T2 ON T1.ID=T2.ID AND T2.STATUS='HOLD' 

由於

回答

1

或短

select 
    t1.id, 
    t1.time2-case when status='HOLD' then t2.time else 0 end-t1.time1 
from 
    t1 left join t2 on t1.id=t2.id and t2.status='HOLD' 
+0

取代了左外連接,這是一個不錯的,簡單而智能的解決方案!謝謝! – Dejan 2012-07-13 10:40:58

+0

歡迎Dejan :) – Madhivanan 2012-07-13 10:46:50

1
SELECT T1.ID 
    , Case 
      When T2.STATUS = 'HOLD' THEN T1.Time2 - T1.Time1 - T2.Time 
      Else T1.Time2 -T1.Time1 
     END 
FROM T1 
LEFT OUTER JOIN T2 ON T1.ID=T2.ID AND T2.STATUS='HOLD' 
+0

這不起作用!對於第一條記錄仍然返回null – Dejan 2012-07-13 10:09:56

1

顯然表T2可以含有多於一行匹配T1.ID.假設T2總是包含至少一個這樣的行,那麼我們可以這樣做:

select T1.ID, min(case when T2.STATUS<>'HOLD' then T1.TIME2-T1.TIME1 
when T2.STATUS='HOLD' then T1.TIME2-T1.TIME1-T2.[TIME] end) 
from T1 join T2 
on T1.ID=T2.ID 
group by T1.ID 
+0

示例數據表明T2將始終包含T1.ID的一些行,如果是這樣,我認爲你的'min(case ...)'方法起作用。然而,那麼'left outer join'是不必要的。如果缺少一個匹配的T2行,那麼'left outer join'只給出T2.STATUS的空值以進行操作,並且案例邏輯失敗。 – hardmath 2012-07-14 17:06:10

+0

@hardmath:感謝您的評論,我用簡單的加入 – 2012-07-16 12:40:50