2012-07-27 3 views
0

ID가 STATUS이고 COMPLETION_TIME이 열 인 JOBS라는 데이터베이스 테이블이 있습니다. STATUS 0,1은 성공이고, STATUS 2,3은 실패하고 STATUS 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

하위 쿼리가 외부 쿼리의 모든 행에 액세스 할 것으로 예상한다고 생각합니다. 이것은 사실이 아닙니다. 하위 쿼리는 현재 행의 열만 사용할 수 있습니다. 이 작업을하려면 각 하위 쿼리에서'from jobs where ... '를 반복해야하고 외부 쿼리에서 where ...를 제거해야합니다. 더 나은 방법은 물론 Gordon Linoff의 대답에서 제시되었지만 그는 'FROM JOBS'을 놓치고 있습니다. –

+0

각 하위 쿼리에서 'jobs from ... where'을 반복 할 수는 있지만 시작 시간과 종료 시간을 여기서 다루므로 세 부분 쿼리의 where 절에서 부분을 반복하지 않을 것입니다 시간이 명시된 인스턴스가 약간 다를 수 있으므로 다른 결과가 있습니까? –

+0

이렇게 할 필요는 없습니다. @ GordonLinoff의 답변을 확인하여 조건부 합계 레코드를 완벽하게 유효한 방법으로 만드십시오. Getutcdate() (및 기타 함수)는 쿼리에 대해 캐시되지 않는 것처럼 보이므로 다른 결과를 얻을 수도 있습니다. 자세한 테스트는 [이 링크] (http://stackoverflow.com/questions/6036223/will-getutcdate-return-the-same-value-if-used-twice-in-the-same-statement)를 확인하십시오. –

답변

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'도 여기에 없습니다 :-) –

+1

@ NikolaMarkovinović ... 아이러니하지 않으면 삶은 더 지루할 것입니다. 나는 내가 "where"절로 그것을 복사했다고 생각한다고 말할 수 있습니다. –

관련 문제