2013-12-21 3 views
2

시간과 휴식 시간 예외가 발생하는 쿼리가 있습니다. 누군가 휴식을 취하지 않으면 중단 시간은 음수입니다. "BreakTime"을보고해야하지만, 음수 나누기 분을 '0'으로 변경해야하며 그렇지 않으면 휴식 분을보고해야합니다.집계에 대한 사례 문을 추가하는 방법

내 쿼리는 다음과 같습니다

SELECT lEmployeeID, sFirstName, sLastName, 
     TotalHours, BreakTime, SkippedBreak, ShortBreak 
FROM (
    SELECT lEmployeeID, sFirstName, sLastName, 
     SUM(TotalHours) AS TotalHours, 
     DATEDIFF(mi, MIN(dtTimeOut), MAX(dtTimeIn)) AS BreakTime, 
     CASE WHEN SUM(ftc.TotalHours) > 6 
       AND DATEDIFF(mi, MIN(ftc.dtTimeOut), MAX(ftc.dtTimeIn)) < 0 
      THEN 1 
      ELSE 0 
     END AS SkippedBreak, 
     CASE WHEN DATEDIFF(mi, MIN(ftc.dtTimeOut), MAX(ftc.dtTimeIn)) < 30 
       AND DATEDIFF(mi, MIN(ftc.dtTimeOut), MAX(ftc.dtTimeIn)) > 0 
      THEN 1 
      ELSE 0 
     END AS ShortBreak 
    FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptList, 
         @iActive, @EmployeeList) AS ftc 
    WHERE (DID IS NOT NULL) 
     OR (DID IS NOT NULL) 
     AND (dtTimeOut IS NULL) 
    GROUP BY lEmployeeID, sFirstName, sLastName 
) AS sub 
WHERE (SkippedBreak = 1) 
    OR (ShortBreak = 1) 

는 지금 내 출력은 다음과 같습니다

Bob Bibby 6.03 -362 
Rob thomas 10.53 -632 
Bret smith 7.6 17 
Ron blah 8.1 25 

은 내가 당신의 쿼리를 감싸

+0

가능한 [Case 문에 집계 또는 신고 된 결과 만 표시하는 방법] 가능한 복제본 (http://stackoverflow.com/questions/20721824/how-to-display-only-aggregate-or-flagged-results-in -a-case-statement) –

+0

마지막 질문에 대한 내 발견에서 파생 된 질문입니다. 그것은 다른 질문입니다. 이제는 0보다 작 으면 "Breaktime"결과를 변경하려고합니다. – Shmewnix

+1

찾고있는 쿼리에 대해 간단한 '입력'데이터와 해당 '출력'데이터 (결과)를 제공하면 훨씬 쉬울 것입니다. – gotqn

답변

1

"0"으로 부정적인 breaktime 분 필요 음의 집계 값을 처리하기 위해 CASE을 사용하는 외부 쿼리 :

SELECT 
    lEmployeeID, sFirstName, sLastName, TotalHours, 
    CASE WHEN BreakTime < 0 THEN 0 ELSE BreakTime END AS BreakTime, 
    SkippedBreak, ShortBreak 
FROM (
    <your current query> 
) t 
관련 문제