2017-07-07 18 views
0

私は、出席していない開始日と終了日を持つテーブルを持っており、IDと月でグループ化された不在期間の合計を取得したいと考えています。私は日付+1の違いを計算してこれを行います。問題は時々、期間が互いに重なることです。次に例を示します。PL/SQL開始日と終了日の差の合計を計算する

ID ABS_START ABS_END  NBR_ABS 

5 04/02/2016 04/02/2016   1 
5 05/02/2016 05/02/2016   1 
5 06/02/2016 07/02/2016   2 
5 07/02/2016 20/02/2016   14 
5 08/02/2016 14/02/2016   7 

NBR_ABS = number of absences relative to dates period 

期待される結果:

ID ABS_MONTH NBR_ABS_MONTH 

5 2016/02   17 
6 2016/02   0 
7 2016/02   5 
8 2016/02   13 
9 2016/02   2 

NBRE_ABS_MONTH = number of absences by id for whole month 

Oracle環境で、このような問題に対処する方法はありますか? あなたの答えをありがとう!

+0

期待される出力は何ですか? – XING

+0

予期している結果をください – Vecchiasignora

+0

データをどのように格納していますか?なぜこのようなデータを保管しているのですか? 2016年2月7日から2016年2月20日までのエントリが既に存在する場合は、2016年2月8日から2016年2月14日に別のエントリを作成する必要がありますか? –

答えて

0

簡単な方法の1つは、範囲内の日付のリストを取得して確認することです。たとえば:

with dates as (
     select (date '2016-02-01') + rownum - 1 
     from all_objects 
     where rownum <= 29 
    ) 
select i.id, count(*) as absence_201602 
from dates cross join 
    (select distinct id from t) i 
where exists (select 1 
       from t 
       where t.id = i.id and 
        d.date between t.abs_start and t.abs_end 
      ) 
group by id; 
+0

ロー数が限られているall_objects(ここで〜73k)に頼るのではなく、 'select(date '2016-02-01')+ rownum - 1 from dual by connect by rownum <= 29'任意の制限は、必要に応じて高く設定できます。日数が問題になっている限り、おそらくall_objectsは十分に大きいかもしれませんが、それを数時間に変更するとそうでないかもしれません。 –

関連する問題