2016-08-01 2 views
0

view_dtrUndertime, LateAMLatePM이 필요합니다. TotalUndertime이면 LateAM 또는 LatePMIS NOT NULL입니다. null이 아닌 경우 다른 열의 데이터를 기반으로 월별 합계를 구합니다. 따라서 null 일 경우 합계에 더하지 않습니다.

| EmpID | DatePresent | Undertime | LateAM | LatePM | 
| 305001 | 2016-04-01 | 00:10:00 | 01:00:00 | 00:12:00 | 
| 305001 | 2016-04-02 | 00:15:00 |   |   | 
| 305001 | 2016-04-03 | 00:20:00 | 00:05:00 |   | 
| 305001 | 2016-04-04 | 00:05:00 |   | 00:01:00 | 
| 305002 | 2016-04-01 | 00:01:00 |   | 00:10:00 | 
| 305002 | 2016-04-02 | 00:10:00 |   |   | 
| 305002 | 2016-04-03 | 00:10:00 | 00:02:00 | 00:03:00 | 

TotalUndertime EmpID = 30500100:35:00해야하며 EmpID = 30500200:11:00을해야합니다. 나는 CASE 문장을 사용하여 전체 합계를 계속 유지합니다.

CASE WHEN LateAM IS NOT NULL AND Undertime IS NOT NULL 
     THEN SEC_TO_TIME(SUM(TIME_TO_SEC(Undertime))) 
    WHEN LatePM IS NOT NULL AND Undertime IS NOT NULL 
     THEN SEC_TO_TIME(SUM(TIME_TO_SEC(Undertime))) 
    ELSE NULL 
END AS TotalUndertime 
FROM view_dtr 
GROUP BY EmpID, MONTH(DatePresent) 

모든 도움과 제안을 부탁드립니다. 초보자 인 것에 대해 유감스럽게 생각합니다.

+0

EmpID 및 DatePresent 열을 포함한 데이터를 게시 할 수 있습니까? – olegsv

답변

0

SUM() 안에 CASE을 입력해야합니다. 왜냐하면 선택 후 집계가 발생하기 때문입니다.

합계를 계산할 때 무시되므로 Undertime = NULL도 필터링 할 필요가 없습니다.

SELECT SEC_TO_TIME(SUM(CASE WHEN LateAM IS NOT NULL OR LatePM IS NOT NULL 
          THEN TIME_TO_SEC(UnderTime) 
         END)) AS TotalUndertime 
FROM view_dtr 
GROUP BY EmpID, MONTH(DatePresent) 
+0

나는 CASE가 나를 도울 것이라고 생각하면서 SEC_TO_TIME (SUM (TIME_TO_SEC (Undertime))) 문장을 지나치게 생각했다. 그것은 그랬지만 나는 그것을 잘못 놓았습니다. 감사합니다. 나는 매우 고맙다. – Clorae