2012-03-06 40 views
2

我創建了一個表格(Attendance)來存儲計算結果,並且我正在更新表格以填充大部分計算結果。我需要弄清楚員工(EMP_NB)當天何時離開工作。這是通過TIMEDIFF(ADDTIME(PERIOD, '1:00'), SEC_TO_TIME(Activity_Secs))計算的。用另一個表格中基於MAX的計算更新表格

我的問題是,我無法弄清楚每個DATE抓取每個EMP_NB的MAX(PERIOD)的方法,同時也抓取相應的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進行分組。你是否想要獲得這個col的最大值? – Teja 2012-03-06 15:54:18

+0

我需要每個DATE與每個EMP_NB在MAX(PERIOD)相同行的Activity_Secs。 – MikeKusold 2012-03-06 15:57:05

+0

試試我剛剛發佈的那一個... – Teja 2012-03-06 16:02:53

回答

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 2012-03-06 16:53:35

+0

你在談論內部SELECT查詢嗎? – Teja 2012-03-06 16:54:30

+0

是的。當它也被「Activity_Secs」分組時,我會在一天中隨機抽出時間。沒有它,我只能得到最大的時間。 – MikeKusold 2012-03-06 17:00:18

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)); 
相關問題