2012-07-27 39 views
0

我有一个名为JOBS的数据库表,它具有ID,STATUS和COMPLETION_TIME作为列。状态0,1成功,状态2,3失败并且状态4,5被终止。它只能有一个状态。我想查找过去10个小时内成功,失败和遇害的工作数量。我必须只使用SELECT作为查询,并且不能为查询使用任何变量。我使用以下查询操作。在SQL中没有使用任何变量的情况下获得结果

SELECT 
(SELECT COUNT(*) 
WHERE STATUS IN (0,1))AS SuccessCount, 

(SELECT COUNT(*) 
WHERE STATUS IN (2,3))AS FailedCount , 

(SELECT COUNT(*) 
WHERE STATUS IN (4,5))AS KilledCount, 

FROM JOBS 

WHERE COMPLETION_TIME >= (SELECT DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE()) - (10 * 60 * 60)) 
AND COMPLETION_TIME <= (SELECT DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE())); 

但是这个查询不起作用。它给了我成功,失败或者死亡的工作,而不是他们的人数。

+0

我认为你期望子查询访问来自外部查询的所有行。这不是真的。子查询只能使用当前行的列。为了这个工作,你将不得不重复'从每个子查询中的... ...作业,并从外部查询中删除... ...。当然,更好的方法是在Gordon Linoff的回答中提出,但他缺少'FROM JOBS'。 – 2012-07-27 19:48:32

+0

我可能在每个子查询中重复'from ... where ...',但由于我在这里处理的是开始时间和结束时间,因此不会在where子句中重复三个子查询的时间部分有不同的结果,因为在哪个时间将被注意到的实例会稍有不同? – 2012-07-30 14:47:33

+0

你不需要这样做,请检查@ GordonLinoff的答案是完全有效的方式来有条件地总结记录。 Getutcdate()(和其他函数)似乎没有被缓存查询,所以是的,可能会得到不同的结果。请检查[此链接](http://stackoverflow.com/questions/6036223/will-getutcdate-return-the-same-value-if-used-twice-in-the-same-statement)以进行详细测试。 – 2012-07-30 19:45:20

回答

0

试试这个:

select sum(case when status in (0, 1) then 1 else 0 end) as succeeded, 
     sum(case when status in (2, 3) then 1 else 0 end) as failed, 
     sum(case when status in (4, 5) then 1 else 0 end) as killed 
from jobs 
WHERE COMPLETION_TIME >= (SELECT DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE()) - (10 * 60 * 60)) and 
     COMPLETION_TIME <= (SELECT DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE())); 

原始查询语法上不正确的。我不明白它是如何返回任何数据,因为子查询:

(SELECT COUNT(*) WHERE STATUS IN (0,1)) 

还没有“FROM”子句来定义变量状态。

+0

具有讽刺意味的是,这里也没有'FROM' :-) – 2012-07-27 19:50:29

+1

@NikolaMarkovinović......没有讽刺意味,生活会更无聊。我只能说我认为我已经用“where”子句复制了它。 – 2012-07-27 20:11:10

相关问题