Microsoft Access 掲示板

キーブレイク処理(クエリにて) / 11

23 コメント
views
4 フォロー
11
hatena 2024/03/27 (水) 18:07:33 修正

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青山 太郎採用201404012014040120140525人事1
2青山 太郎出向開始201405262014052620140531人事1
3青山 太郎職種変更201406012014060120150331人事1
4青山 太郎出向終了201511012015110120170930経営企画2
5青山 太郎職種変更201710012017100120210331法務3
6青山 太郎202008012017100120210331法務3
7青山 太郎出向開始202104012021040120220331人事4
8青山 太郎職種変更202204012022040120230331総務5
9青山 太郎出向先変更202304012023040199991231総務5
10山田 花子採用201404012022010120220331営業1
11山田 花子出向開始201405262023040120230831経営企画2
12山田 花子職種変更202309012023090120231231営業3
13山田 花子出向終了202401012024010120240331営業3
14山田 花子職種変更202404012024040199991231総務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出力結果

氏名組織名開始日の最小終了日の最大
山田 花子営業2022010120220331
山田 花子経営企画2023040120230831
山田 花子営業2023090120240331
山田 花子総務2024040199991231
青山 太郎人事2014040120150331
青山 太郎経営企画2015110120170930
青山 太郎法務2017100120210331
青山 太郎人事2021040120220331
青山 太郎総務2022040199991231

終了日と次のレコードの開始日の連続性は考慮していないので、もし、連続しない(例えば休職とか)場合があるなら、
VBAにその条件判断を追加する必要はあります。

通報 ...