PER Absence Calendar

Description
Absence Calendar by John Keymer
with calendar as (
  select dt dt,
         to_char(dt, 'DD') day,
         to_char((trunc(dt, 'IW') - trunc(trunc(dt,'MM'),'IW'))/7 + 1) 
           || '_' 
           || to_char((trunc(dt) - trunc(dt,'IW')) + 1) week_day,
         to_char(dt,'Month') day_month,
         to_char(dt, 'MM') month_no
    from (
      select to_date('0101' || :p_year, 'ddmmyyyy') + level - 1 dt
        from dual
     connect by level <= to_date('3112' || :p_year,'ddmmyyyy') - to_date('0101' || :p_year,'ddmmyyyy') + 1)
)
select day_month month, 
       mon_1, tue_1, wed_1, thu_1, fri_1, sat_1, sun_1,
       mon_2, tue_2, wed_2, thu_2, fri_2, sat_2, sun_2,
       mon_3, tue_3, wed_3, thu_3, fri_3, sat_3, sun_3,
       mon_4, tue_4, wed_4, thu_4, fri_4, sat_4, sun_4,
       mon_5, tue_5, wed_5, thu_5, fri_5, sat_5, sun_5,
       mon_6, tue_6
  from (
    select cal.day, cal.week_day, cal.day_month, cal.month_no, absence.absence_category
      from calendar cal
      left join (select paa.person_id, 
                        paat.absence_category, 
                        nvl(paa.sickness_start_date, paa.date_start) start_date, 
                        coalesce(paa.sickness_end_date,paa.date_end, trunc(sysdate)) end_date
                   from per_absence_attendances paa 
                   join per_people_x ppx on ppx.person_id = paa.person_id
                   join per_absence_attendance_types paat on paat.absence_attendance_type_id = paa.absence_attendance_type_id
                  where ppx.person_id in (select ppx.person_id from per_people_x ppx where ppx.full_name=:person_full_name)) absence
            on cal.dt between absence.start_date and absence.end_date) v
pivot (max(day || nvl2(absence_category, chr(10) || '[' || absence_category || ']',null)) 
  for week_day in ('1_1' mon_1,'1_2' tue_1,'1_3' wed_1,'1_4' thu_1,'1_5' fri_1,'1_6' sat_1,'1_7' sun_1,
                   '2_1' mon_2,'2_2' tue_2,'2_3' wed_2,'2_4' thu_2,'2_5' fri_2,'2_6' sat_2,'2_7' sun_2,
                   '3_1' mon_3,'3_2' tue_3,'3_3' wed_3,'3_4' thu_3,'3_5' fri_3,'3_6' sat_3,'3_7' sun_3,
                   '4_1' mon_4,'4_2' tue_4,'4_3' wed_4,'4_4' thu_4,'4_5' fri_4,'4_6' sat_4,'4_7' sun_4,
                   '5_1' mon_5,'5_2' tue_5,'5_3' wed_5,'5_4' thu_5,'5_5' fri_5,'5_6' sat_5,'5_7' sun_5,
                   '6_1' mon_6,'6_2' tue_6))
order by month_no
Parameter Name SQL text Validation
Employee
 
LOV
Year
 
Number