Microsoft Access 掲示板

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

23 コメント
views
4 フォロー
14
はづき 2024/06/19 (水) 14:45:08 07832@267c5

こちらのスレッドでアドレスいただいた者です。

ベースになるデータの仕様が少し変わりまして、開始日・終了日を持たず、
発令日(=開始日)のみしか持たないデータソースを使うこととなりました。

SetRenban関数にて在籍期間Noをふり、開始日および終了日はSQLで在籍期間NoのMin、Max
にて計算するというものを実装しています。

今回、ご相談させていただきたいのは、開始日は在籍期間NoのMinで良いのですが、
終了日が、理論上は[在籍期間No] + 1のMinの前日となると思っていますが、
私ができる初歩的なレベルですと、もうひとつクエリを作って、両者を結合させるとかになります。

このあたりの実装でご相談させてください。

通報 ...
  • 15
    はづき 2024/06/19 (水) 14:49:39 07832@267c5 >> 14

    [在籍期間No]をひとつずらして結合させるところができずにいます。

    18

    サンプルを載せておきます

    最初に SetSequenceNumber関数 をデータベースにインポートして
    利用可能な状態にしておきましょう

    グループ毎連番を自動入力する関数
    クエリで連番を表示する場合、DCount関数やサブクエリを利用する方法はあちこちで紹介されています。 しかし、この方法は自分より前のレコード件数をカウントするというロジックなのでレコード件数が多くなると幾何級数的に重くなります。また、グループ毎に連番を振るという仕様になると、条件式も複雑になってきます。 クエリは使わずにテーブルに連番フィールドを持たせて、そこに VBA で連番を書きこむようにすると高速...
    fc2

     
    ■DDL

    CREATE TABLE アクションテーブル (
          氏名     VARCHAR(50) NOT NULL
        , 発令日   DATETIME    NOT NULL
        , 組織名   VARCHAR(30) NOT NULL
        , GSeq日付 INT
        , GSeq組織 INT
        , CONSTRAINT pk_action PRIMARY KEY ( 氏名, 発令日 )
    );
    

     
    ■データ例 (連番付与前)

    氏名発令日組織名GSeq日付GSeq組織
    山田 花子2022/01/01営業
    山田 花子2023/04/01経営企画
    山田 花子2023/09/01営業
    山田 花子2024/01/01営業
    山田 花子2024/04/01総務
    青山 太郎2014/04/01人事
    青山 太郎2014/05/26人事
    青山 太郎2014/06/01人事
    青山 太郎2015/04/01経営企画
    青山 太郎2017/10/01法務
    青山 太郎2018/04/01法務
    青山 太郎2020/01/01法務
    青山 太郎2021/04/01人事
    青山 太郎2022/04/01総務

     
    ■グループ連番の付与

    Sub set_number()
        Call SetSequenceNumber("GSeq日付", "アクションテーブル", "氏名", "発令日")
        Call SetSequenceNumber("GSeq組織", "アクションテーブル", "氏名,組織名", "発令日")
    End Sub
    

     
    ■データ例 (連番付与後)

    氏名発令日組織名GSeq日付GSeq組織
    山田 花子2022/01/01営業11
    山田 花子2023/04/01経営企画21
    山田 花子2023/09/01営業32
    山田 花子2024/01/01営業43
    山田 花子2024/04/01総務51
    青山 太郎2014/04/01人事11
    青山 太郎2014/05/26人事22
    青山 太郎2014/06/01人事33
    青山 太郎2015/04/01経営企画41
    青山 太郎2017/10/01法務51
    青山 太郎2018/04/01法務62
    青山 太郎2020/01/01法務73
    青山 太郎2021/04/01人事84
    青山 太郎2022/04/01総務91
  • 19
    mayu 2024/06/19 (水) 19:06:32 修正 fc5d2@6c788 >> 14

    (続き)

    ■DML

    SELECT x.氏名
         , x.組織名
         , Min( x.発令日 ) As 発令日
         , Max( Nz( DateAdd( 'd', -1, y.発令日 ), #12/31/2099# ) ) As 失効日
    FROM アクションテーブル x
    LEFT JOIN  アクションテーブル y
           ON x.氏名 = y.氏名
          AND x.GSeq日付 = y.GSeq日付 - 1
    GROUP BY x.氏名
           , x.組織名
           , x.GSeq日付 - x.GSeq組織
    ORDER BY x.氏名
           , Min( x.発令日 )
    ;
    

     
    ■結果

    氏名組織名発令日失効日
    山田 花子営業2022/01/012023/03/31
    山田 花子経営企画2023/04/012023/08/31
    山田 花子営業2023/09/012024/03/31
    山田 花子総務2024/04/012099/12/31
    青山 太郎人事2014/04/012015/03/31
    青山 太郎経営企画2015/04/012017/09/30
    青山 太郎法務2017/10/012021/03/31
    青山 太郎人事2021/04/012022/03/31
    青山 太郎総務2022/04/012099/12/31