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()));
하지만이 쿼리는 작동하지 않습니다. 성공, 실패 또는 사망 한 직업이 나 자신의 번호가 아닌 직업을 제공합니다.
하위 쿼리가 외부 쿼리의 모든 행에 액세스 할 것으로 예상한다고 생각합니다. 이것은 사실이 아닙니다. 하위 쿼리는 현재 행의 열만 사용할 수 있습니다. 이 작업을하려면 각 하위 쿼리에서'from jobs where ... '를 반복해야하고 외부 쿼리에서 where ...를 제거해야합니다. 더 나은 방법은 물론 Gordon Linoff의 대답에서 제시되었지만 그는 'FROM JOBS'을 놓치고 있습니다. –
각 하위 쿼리에서 'jobs from ... where'을 반복 할 수는 있지만 시작 시간과 종료 시간을 여기서 다루므로 세 부분 쿼리의 where 절에서 부분을 반복하지 않을 것입니다 시간이 명시된 인스턴스가 약간 다를 수 있으므로 다른 결과가 있습니까? –
이렇게 할 필요는 없습니다. @ GordonLinoff의 답변을 확인하여 조건부 합계 레코드를 완벽하게 유효한 방법으로 만드십시오. Getutcdate() (및 기타 함수)는 쿼리에 대해 캐시되지 않는 것처럼 보이므로 다른 결과를 얻을 수도 있습니다. 자세한 테스트는 [이 링크] (http://stackoverflow.com/questions/6036223/will-getutcdate-return-the-same-value-if-used-twice-in-the-same-statement)를 확인하십시오. –