2016-08-01 4 views
0

У меня есть view_dtr с колонками Undertime, LateAM и LatePM Мне нужно получить TotalUndertime, если LateAM или LatePMIS NOT 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 = 305001 должен быть только 00:35:00 и EmpID = 305002 должны быть 00: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

Вам необходимо сделать CASEвнутриSUM(), потому что агрегация возникает после выбора.

Вы также не должны отфильтровывать 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

Я переоценил это утверждение 'SEC_TO_TIME (SUM (TIME_TO_SEC (Undertime)))' думая, что CASE мне поможет. Он сделал это, но я просто поместил его не так. Спасибо тебе за это. Я очень благодарен. – Clorae

Смежные вопросы