mayu
2024/03/27 (水) 14:48:05
fc5d2@6c788
組織の在籍期間を算定しようと思っています。
⇒赤色でハイライトした箇所が正しく拾えず、黄色の箇所が結果として合っている
⇒出戻りの、更に、出戻りもある可能性もあります
方法は色々とありますけど、SQLのサンプルを載せておきます
■アクションテーブル
氏名 | 開始日 | 終了日 | 組織名 |
---|---|---|---|
青山 太郎 | 2014/04/01 | 2014/05/25 | 人事 |
青山 太郎 | 2014/05/26 | 2014/05/31 | 人事 |
青山 太郎 | 2014/06/01 | 2015/03/31 | 人事 |
青山 太郎 | 2015/04/01 | 2017/09/30 | 経営企画 |
青山 太郎 | 2017/10/01 | 2018/03/31 | 法務 |
青山 太郎 | 2018/04/01 | 2019/12/31 | 法務 |
青山 太郎 | 2020/01/01 | 2021/03/31 | 法務 |
青山 太郎 | 2021/04/01 | 2022/03/31 | 人事 |
青山 太郎 | 2022/04/01 | 2099/12/31 | 総務 |
山田 花子 | 2022/01/01 | 2022/03/31 | 営業 |
山田 花子 | 2023/04/01 | 2023/08/31 | 経営企画 |
山田 花子 | 2023/09/01 | 2023/12/31 | 営業 |
山田 花子 | 2024/01/01 | 2024/03/31 | 営業 |
山田 花子 | 2024/04/01 | 9999/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/01 | 2015/03/31 |
青山 太郎 | 経営企画 | 2015/04/01 | 2017/09/30 |
青山 太郎 | 法務 | 2017/10/01 | 2021/03/31 |
青山 太郎 | 人事 | 2021/04/01 | 2022/03/31 |
青山 太郎 | 総務 | 2022/04/01 | 2099/12/31 |
山田 花子 | 営業 | 2022/01/01 | 2022/03/31 |
山田 花子 | 経営企画 | 2023/04/01 | 2023/08/31 |
山田 花子 | 営業 | 2023/09/01 | 2024/03/31 |
山田 花子 | 総務 | 2024/04/01 | 9999/12/31 |
通報 ...