2012-03-06 5 views
2

Я создал таблицу (Посещаемость) для хранения вычислений, и я обновляю таблицу, чтобы заполнить большинство вычислений. Мне нужно выяснить, когда работник (EMP_NB) оставил работу в течение дня. Это рассчитывается по TIMEDIFF(ADDTIME(PERIOD, '1:00'), SEC_TO_TIME(Activity_Secs)).Обновление таблицы с вычислением на основе MAX из другой таблицы

Моя проблема заключается в том, что я не могу понять способ захватить МАКСИМАЛЬНЫЙ ПЕРИОД за EMP_NB за DATE, а также захватить соответствующие Activity_Secs.

TABLEA

 
╭────────┬──────┬────────┬───────────────╮ 
│ EMP_NB │ DATE │ Period │ Activity_Secs │ 
╰────────┴──────┴────────┴───────────────╯ 

Вот код MySQL я сделал, чтобы получить первый период работник авторизованы.

UPDATE calc_Attendance AS att, tableA AS a 
JOIN (
     SELECT 
     EMP_NB, 
     DATE, 
     Period, 
     Activity_Secs 
     FROM tableA 
     GROUP BY EMP_NB, DATE, Period 
    ) m 
ON a.EMP_NB = m.EMP_NB and a.DATE = m.DATE and a.Period = m.Period 
SET DEPTARTURE_ACTUAL = TIMEDIFF(ADDTIME(m.Period, '1:00'), SEC_TO_TIME(m.Activity_Secs)) 
WHERE att.EMP_NB = m.EMP_NB AND att.DATE = m.DATE 
; 

Любая помощь будет оценена. У меня нет большого опыта работы с SQL, так что это сводит меня с ума.

+0

Вы не группируете Activity_Secs в ur-запросе. Вы хотите взять максимальное значение этого col? – Teja

+0

Мне нужен Activity_Secs, который находится в той же строке, что и MAX (PERIOD) за EMP_NB за DATE. – MikeKusold

+0

Попробуйте тот, который я только что опубликовал ... – Teja

ответ

0
UPDATE calc_Attendance AS att, tableA AS a 
JOIN (
     SELECT 
     EMP_NB, 
     DATE, 
     MAX(Period) AS Period, 
     Activity_Secs 
     FROM tableA 
     GROUP BY EMP_NB,DATE,Activity_Secs 
    ) m 
ON a.EMP_NB = m.EMP_NB and a.DATE = m.DATE and a.Period = m.Period 
SET DEPTARTURE_ACTUAL = TIMEDIFF(ADDTIME(m.Period, '1:00'), SEC_TO_TIME(m.Activity_Secs)) 
WHERE att.EMP_NB = m.EMP_NB AND att.DATE = m.DATE 
; 
+0

Ваш код работал, когда я изменил: 'GROUP BY EMP_NB, DATE, Activity_Secs' в' GROUP BY EMP_NB, DATE'. Спасибо за помощь! – MikeKusold

+0

Вы говорите о внутреннем запросе SELECT? – Teja

+0

Да. Когда он также был сгруппирован по «Activity_Secs», я получал случайные времена в течение дня. Без этого я получаю только максимальное время. – MikeKusold

0

Не уверен, что на цели tableA в запросе, но я думаю, что должно работать.

UPDATE calc_Attendance AS att 
JOIN (
    SELECT * 
    FROM (
     SELECT EMP_NB, DATE, Period, Activity_Secs 
     FROM tableA 
     ORDER BY Period DESC 
    ) m1 
    GROUP BY EMP_NB, DATE 
) m 
ON att.EMP_NB = m.EMP_NB and att.DATE = m.DATE 
SET DEPTARTURE_ACTUAL = TIMEDIFF(ADDTIME(m.Period, '1:00'), SEC_TO_TIME(m.Activity_Secs));