Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从表中减去SQL时间(从第二个表中针对特定时间状态额外减少)_Sql_Subtraction - Fatal编程技术网

从表中减去SQL时间(从第二个表中针对特定时间状态额外减少)

从表中减去SQL时间(从第二个表中针对特定时间状态额外减少),sql,subtraction,Sql,Subtraction,我有T1表和T2表 T1 T2 如果表T2中不存在状态保持,则我需要结果TIME2-TIME1;如果该记录的表中存在状态保持,则为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

我有T1表和T2表

T1

T2

如果表T2中不存在状态保持,则我需要结果TIME2-TIME1;如果该记录的表中存在状态保持,则为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'

谢谢

显然,表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
选择T1.ID,min(情况是T2.状态为“保持”,然后选择T1.TIME2-T1.TIME1
当T2.STATUS='HOLD'时,则T1.TIME2-T1.TIME1-T2。[时间]结束)
从T1连接T2
在T1.ID=T2.ID上
按T1.ID分组
或简而言之

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'

示例数据表明T2将始终包含T1.ID的一些行,如果是这样,我认为您的
min(case…
方法是有效的。然而,
左外连接则是不必要的。如果缺少T2的匹配行,
左外部联接
只提供T2.STATUS的空值进行操作,并且大小写逻辑失败。@hardmath:谢谢您的评论,我已将左外部联接替换为简单联接
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'
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
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'