2017-02-19 6 views
0

Я пытаюсь отобразить данные, сгруппированные по 12-месячному периоду, в зависимости от даты начала мин. Если FTE был изменен в течение 12-месячного периода, он будет указан с соответствующей датой начала и окончания. Данные испытаний приведены в [Data grouped by date in oracle sqlЗапрос Oracle - Отображение данных, сгруппированных ежегодно

Например, дата начала 19/05/2008. Таким образом, начало года - 19/05/2008, а конец года - 18/05/2009. Если бы FTE был изменен между 19/05/2009 и 18/05/2010, тогда результирующий набор будет иметь 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

Пожалуйста, обратитесь назад к решению указанной в оригинальной теме Data grouped by date in oracle sql

В нижеприведенном растворе, добавить еще один бит информации для этого запроса, в столбце y - показать количество лет (округленное до ближайшего целого) для каждого созданного там интервала. Я использую этот бит в дополнительном, охватывающем (внешнем) запросе для генерации «годовых» интервалов, как в вашем новом требовании. Стандартный способ сделать это с помощью традиционного иерархического запроса, как показано ниже.

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. 
Смежные вопросы