SQLもいいのですが複雑になるので、私がするなら、メンテナンス性とパフォーマンスを考慮して、
テーブルに在籍期間判定用のフィールドを追加して、
VBA(DAO)でそこに在籍期間ごとの連番を入力していくようにするかな。
Public Sub SetRenban()
Dim rs As DAO.Recordset
Dim c As Long
Dim pre氏名, pre組織名
Dim strSQL As String
strSQL = "SELECT 在籍期間No, 氏名, 開始日, 終了日, 組織名 FROM アクションテーブル " & _
"ORDER BY 氏名, 開始日, 終了日;"
Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbFailOnError)
Do Until rs.EOF
If pre氏名 = rs!氏名 Then
If pre組織名 <> rs!組織名 Then
c = c + 1
pre組織名 = rs!組織名
End If
Else
c = 1
pre氏名 = rs!氏名
pre組織名 = rs!組織名
End If
rs.Edit
rs(0) = c
rs.Update
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
MsgBox "完了"
End Sub
上記の実行結果
ID | 氏名 | アクション | 発令日 | 開始日 | 終了日 | 組織名 | 在籍期間No |
---|---|---|---|---|---|---|---|
1 | 青山 太郎 | 採用 | 20140401 | 20140401 | 20140525 | 人事 | 1 |
2 | 青山 太郎 | 出向開始 | 20140526 | 20140526 | 20140531 | 人事 | 1 |
3 | 青山 太郎 | 職種変更 | 20140601 | 20140601 | 20150331 | 人事 | 1 |
4 | 青山 太郎 | 出向終了 | 20151101 | 20151101 | 20170930 | 経営企画 | 2 |
5 | 青山 太郎 | 職種変更 | 20171001 | 20171001 | 20210331 | 法務 | 3 |
6 | 青山 太郎 | 20200801 | 20171001 | 20210331 | 法務 | 3 | |
7 | 青山 太郎 | 出向開始 | 20210401 | 20210401 | 20220331 | 人事 | 4 |
8 | 青山 太郎 | 職種変更 | 20220401 | 20220401 | 20230331 | 総務 | 5 |
9 | 青山 太郎 | 出向先変更 | 20230401 | 20230401 | 99991231 | 総務 | 5 |
10 | 山田 花子 | 採用 | 20140401 | 20220101 | 20220331 | 営業 | 1 |
11 | 山田 花子 | 出向開始 | 20140526 | 20230401 | 20230831 | 経営企画 | 2 |
12 | 山田 花子 | 職種変更 | 20230901 | 20230901 | 20231231 | 営業 | 3 |
13 | 山田 花子 | 出向終了 | 20240101 | 20240101 | 20240331 | 営業 | 3 |
14 | 山田 花子 | 職種変更 | 20240401 | 20240401 | 99991231 | 総務 | 4 |
SQL
SELECT t.氏名, t.組織名, Min(t.開始日) AS 開始日, Max(t.終了日) AS 終了日
FROM アクションテーブル As t
GROUP BY t.氏名, t.組織名, t.在籍期間No
ORDER BY t.氏名, t.在籍期間No;
SQL出力結果
氏名 | 組織名 | 開始日の最小 | 終了日の最大 |
---|---|---|---|
山田 花子 | 営業 | 20220101 | 20220331 |
山田 花子 | 経営企画 | 20230401 | 20230831 |
山田 花子 | 営業 | 20230901 | 20240331 |
山田 花子 | 総務 | 20240401 | 99991231 |
青山 太郎 | 人事 | 20140401 | 20150331 |
青山 太郎 | 経営企画 | 20151101 | 20170930 |
青山 太郎 | 法務 | 20171001 | 20210331 |
青山 太郎 | 人事 | 20210401 | 20220331 |
青山 太郎 | 総務 | 20220401 | 99991231 |
終了日と次のレコードの開始日の連続性は考慮していないので、もし、連続しない(例えば休職とか)場合があるなら、
VBAにその条件判断を追加する必要はあります。
通報 ...