所属情報を持たないユーザとその期間を抽出する方法
新人SEの初投稿のため、拙い文章お許しください。
テーブル定義
担当案件ではDBにOracle11gR2を使っています。
マスタとして下記の2テーブルを持っております。
- 項目は全てvarchar2で定義されています。
- どちらも"ユーザ"、"期間コード"が主キーです。
アカウント情報
ユーザ 期間コード 開始日 終了日
A00001 bbbbbbbbb 2014/04/01|00:00:00 9999/12/31|23:59:59
A00002 cccccccc 2012/04/01|00:00:00 9999/12/31|23:59:59
A00003 ddddddddd 2011/01/01|00:00:00 9999/12/31|23:59:59
A00004 eeeeeeee 2014/11/18|00:00:00 9999/12/31|23:59:59
所属情報
ユーザ 期間コード 組織コード 開始日 終了日
A00001 xxxxxxxxxx A100 2014/04/01|00:00:00 2014/11/19|00:00:00
A00002 yyyyyyyyyy B200 2014/01/01|00:00:00 9999/12/31|23:59:59
A00002 zzzzzzzzzz C300 2012/04/01|00:00:00 2014/01/01|00:00:00
A00003 aaaaaaaaaa D400 2014/04/01|00:00:00 9999/12/31|23:59:59
アカウント情報にはシステムに登録済のユーザとその有効期間が入っています。
所属情報にはいつからいつまでどの組織にいたという情報が入っています。
- ユーザは組織に所属していない期間もあります。
- 1ユーザが同じ組織に期間が分断して所属していることもあります。
- 2012年、2014年は所属組織があるが2013年だけないというユーザも存在します。
実現したいこと
上記の情報から、所属組織が設定されていないユーザ+その設定されていない期間を一覧形式で取得したいです。
理想的にはPL/SQL、ストアドプロシージャあるいはテーブルをExcelに出力し、VBA等で実行させたいです。
出力例
テーブルの内容が上記例だった場合には以下のような一覧を取得したいです。
ユーザ 所属なし期間
A00001 2014/11/19~9999/12/31
A00003 2011/1/1~2014/3/31
A00004 2014/11/18~9999/12/31
A00001の場合
A00001(2014/4/1~9999/12/31)アカウントON
A100に 2014/4/1~2014/11/18 所属
⇒2014/11/19以降が所属なしとして抽出対象
A00002の場合
A00002(2012/4/1~9999/12/31)アカウントON
B200に 2012/4/1~2013/12/31 所属
C300に 2014/1/1~ 所属
⇒アカウントON期間に全て所属組織が設定されているため、抽出対象にならない
A00003の場合
A00003(2011/1/1~9999/12/31)アカウントON
D400に 2014/4/1~ 所属
⇒2014/4/1以前が所属なしとして抽出対象
A00004の場合
A00004(2014/11/18~9999/12/31)アカウントON
所属組織設定なし(所属情報テーブルにレコードなし)
⇒2014/11/18~9999/12/31が所属なしで抽出される
実現方法をご教示いただけると大変助かります。
よろしくお願いします。
2015/2/4 追記
編集、ご回答頂きありがとうございます。
パターンとして下記が漏れておりました。
・所属情報が歯抜けになっているパターン
⇒所属情報テーブルの3行目が
A00002 zzzzzzzzzz C300 2012/04/01|00:00:00 2014/01/01|00:00:00
ではなく
A00002 zzzzzzzzzz C300 2012/04/01|00:00:00 2013/01/01|00:00:00
のような場合
・1ユーザに対するアカウント情報が複数レコードあるパターン
A00004 eeeeeeee1 2014/01/01|00:00:00 2014/11/17|23:59:59
A00004 eeeeeeee2 2014/11/18|00:00:00 9999/12/31|23:59:59