Microsoft Access 掲示板

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

13 コメント
views
4 フォロー
9

組織の在籍期間を算定しようと思っています。
⇒赤色でハイライトした箇所が正しく拾えず、黄色の箇所が結果として合っている
⇒出戻りの、更に、出戻りもある可能性もあります

方法は色々とありますけど、SQLのサンプルを載せておきます

■アクションテーブル

氏名開始日終了日組織名
青山 太郎2014/04/012014/05/25人事
青山 太郎2014/05/262014/05/31人事
青山 太郎2014/06/012015/03/31人事
青山 太郎2015/04/012017/09/30経営企画
青山 太郎2017/10/012018/03/31法務
青山 太郎2018/04/012019/12/31法務
青山 太郎2020/01/012021/03/31法務
青山 太郎2021/04/012022/03/31人事
青山 太郎2022/04/012099/12/31総務
山田 花子2022/01/012022/03/31営業
山田 花子2023/04/012023/08/31経営企画
山田 花子2023/09/012023/12/31営業
山田 花子2024/01/012024/03/31営業
山田 花子2024/04/019999/12/31総務

 
■SQL

SELECT 氏名
     , 組織名
     , 開始日
     , Min( q.終了日 ) As 終了日
FROM
(
    SELECT x.氏名
         , x.組織名
         , x.開始日
         , y.終了日
    FROM アクションテーブル x
    INNER JOIN ( アクションテーブル y
                 INNER JOIN アクションテーブル z
                         ON y.氏名 = z.氏名 and y.組織名 = z.組織名
    )
    ON x.氏名 = y.氏名 AND
       x.組織名 = y.組織名
    WHERE x.終了日 <= y.終了日
    GROUP BY x.氏名
           , x.組織名
           , x.開始日
           , y.終了日
    HAVING Sum(
               IIf( 
                       ( z.開始日 <  x.開始日
                            AND 
                         x.開始日 <= DateAdd( 'd', 1, z.終了日 )
                       )
                   OR
                       ( y.終了日 <  z.終了日
                           AND 
                         z.開始日 <= DateAdd( 'd', 1, y.終了日 )
                       )
                 , 1
                 , 0
               )
           ) = 0
) q
GROUP BY 氏名
       , 組織名
       , 開始日
ORDER BY 1, 3 ;

 
■結果

氏名組織名開始日終了日
青山 太郎人事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
山田 花子営業2022/01/012022/03/31
山田 花子経営企画2023/04/012023/08/31
山田 花子営業2023/09/012024/03/31
山田 花子総務2024/04/019999/12/31
通報 ...