2017-02-19 2 views
0

最小開始日に基づいて12カ月単位でグループ化されたデータを表示しようとしています。 FTEが12ヶ月間に変更された場合、それに対応する開始日と終了日がリストされます。テストデータは、[Oracleクエリ - 1年ごとにグループ化されたデータを表示する

のように提供されます。たとえば、開始日は19/05/2008です。だから今年は19/05/2008、年末は18/05/2009です。 FTEが19/05/2009から2010/08/05の間に変更された場合、結果セットは2周年の期間に2行を持ちます。の数を表示する -

YearEmployeeJob Start date end date FTE Year_start Year_end 
1 1111 1 19/05/2008 18/05/2009 100 19/05/2008 18/05/2009 
2 1111 1 19/05/2009 18/05/2010 100 19/05/2009 18/05/2010 
3 1111 1 19/05/2010 18/05/2011 100 19/05/2010 18/05/2011 
4 1111 1 19/05/2011 17/05/2012 100 19/05/2011 17/05/2012 
5 1111 1 19/05/2012 18/05/2013 100 19/05/2012 18/05/2013 
6 1111 1 19/05/2013 27/11/2013 100 19/05/2013 18/05/2014 
6 1111 1 28/11/2013 18/05/2014 60 19/05/2013 18/05/2014 
7 1111 1 19/05/2014 18/05/2015 60 19/05/2014 18/05/2015 
8 1111 1 19/05/2015 24/08/2015 60 19/05/2015 17/05/2016 
8 1111 1 25/08/2015 18/05/2016 68.571 19/05/2015 17/05/2016 

答えて

0

、私はyという欄に、そのクエリへの情報の1つの以上のビットを追加し、以下のソリューションでは、あなたの元のスレッドData grouped by date in oracle sql

に提供される解決策に戻って参照してくださいそこで作成された各間隔の年(最も近い整数に丸められた)。私は、あなたの新しい要件のように "年間"の間隔を生成するために、この包みを追加の(外側の)包み込みで使用します。これを行うための標準的な方法は、以下に示すような従来の階層的なクエリを使用する方法です。

select level as yr, employee, job, 
     add_months(start_date, 12 * (level - 1)) as start_date, 
     case when level < y then add_months(start_date, 12 * level) - 1 
       else end_date end as end_date, 
     FTE 
from (
    select employee, job, min(start_date) as start_date, max(end_date) as end_date, FTE, 
      ceil(months_between(max(end_date), min(start_date))/12) as y 
    from  (select employee, job, start_date, end_date, FTE, 
       row_number() over (partition by employee, job  order by start_date) - 
       row_number() over (partition by employee, job, FTE order by start_date) 
                       as grp 
      from t 
      ) 
    group by employee, job, FTE, grp 
    ) 
connect by level <= y 
    and prior employee = employee 
    and prior start_date = start_date 
    and prior sys_guid() is not null 
order by employee, start_date  -- if needed 
; 

出力

YR EMPLOYEE JOB START_DATE END_DATE   FTE 
--- ---------- ----- ----------- ----------- ---------- 
    1 1111  1  19-May-2008 18-May-2009  100 
    2 1111  1  19-May-2009 18-May-2010  100 
    3 1111  1  19-May-2010 18-May-2011  100 
    4 1111  1  19-May-2011 18-May-2012  100 
    5 1111  1  19-May-2012 18-May-2013  100 
    6 1111  1  19-May-2013 27-Nov-2013  100 
    1 1111  1  28-Nov-2013 27-Nov-2014   60 
    2 1111  1  28-Nov-2014 24-Aug-2015   60 
    1 1111  1  25-Aug-2015 24-Aug-2016  68.571 
    2 1111  1  25-Aug-2016 11-Sep-2016  68.571 
    1 1111  1  12-Sep-2016 29-Sep-2016  72.857 
    1 1111  1  30-Sep-2016 10-Nov-2016  91.429 
    1 1111  1  11-Nov-2016 23-Apr-2017  100 
    1 1111  1  24-Apr-2017 14-Jan-2018   60 
    1 1111  1  15-Jan-2018 14-Jan-2019  71.429 
    2 1111  1  15-Jan-2019 31-May-2019  71.429 
    1 1111  1  01-Jun-2019 31-May-2020  100 
    2 1111  1  01-Jun-2020 31-May-2021  100 
    3 1111  1  01-Jun-2021 31-May-2022  100 
    4 1111  1  01-Jun-2022 31-May-2023  100 
    5 1111  1  01-Jun-2023 31-May-2024  100 
     ............................. 
29 1111  1  01-Jun-2047 31-May-2048  100 
30 1111  1  01-Jun-2048 31-May-2049  100 
31 1111  1  01-Jun-2049 31-Dec-2049  100 

47 rows selected. 
関連する問題