2012-07-13 17 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