2012-03-06 9 views
2

計算を格納するテーブル(出席)を作成しました。計算の大部分を満たすようにテーブルを更新しています。従業員(EMP_NB)がその日に仕事を辞めた時期を把握する必要があります。これはTIMEDIFF(ADDTIME(PERIOD, '1:00'), SEC_TO_TIME(Activity_Secs))によって計算されます。別のテーブルからのMAXベースの計算によるテーブルの更新

私の問題は、DATEごとにEMP_NBごとにMAX(PERIOD)を取得し、対応するActivity_Secを取得する方法を見つけることができないということです。

に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

あなたはurクエリーでActivity_Secsをグループ化していません。この列の最大値を取っておきたいですか? – Teja

+0

DATEごとにEMP_NBごとにMAX(PERIOD)と同じ行にあるActivity_Secsが必要です。 – 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

Inner 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)); 
関連する問題