Code:
select EXP_DATE,
JANUARY,
FEBRUARY,
MARCH,
APRIL,
MAY,
JUNE,
JULY,
AUGUST,
SEPTEMBER,
OCTOBER,
NOVEMBER,
DECEMBER from (
select EXP_DATE,
first_value(JANUARY) over (partition by EXP_DATE order by EXP_DATE) JANUARY,
first_value(FEBRUARY) over (partition by EXP_DATE order by EXP_DATE) FEBRUARY,
first_value(MARCH) over (partition by EXP_DATE order by EXP_DATE) MARCH,
first_value(APRIL) over (partition by EXP_DATE order by EXP_DATE) APRIL,
first_value(MAY) over (partition by EXP_DATE order by EXP_DATE) MAY,
first_value(JUNE) over (partition by EXP_DATE order by EXP_DATE) JUNE,
first_value(JULY) over (partition by EXP_DATE order by EXP_DATE) JULY,
first_value(AUGUST) over (partition by EXP_DATE order by EXP_DATE) AUGUST,
first_value(SEPTEMBER) over (partition by EXP_DATE order by EXP_DATE) SEPTEMBER,
first_value(OCTOBER) over (partition by EXP_DATE order by EXP_DATE) OCTOBER,
first_value(NOVEMBER) over (partition by EXP_DATE order by EXP_DATE) NOVEMBER,
first_value(DECEMBER) over (partition by EXP_DATE order by EXP_DATE) DECEMBER,
row_number() over (partition by EXP_DATE order by EXP_DATE) RN
from (
SELECT to_char(expiry_date, 'DD') EXP_DATE,
decode(to_char(expiry_date, 'MON'),'JAN', cnt, null) JANUARY,
decode(to_char(expiry_date, 'MON'),'FEB', cnt, null) FEBRUARY,
decode(to_char(expiry_date, 'MON'),'MAR', cnt, null) MARCH,
decode(to_char(expiry_date, 'MON'),'APR', cnt, null) APRIL,
decode(to_char(expiry_date, 'MON'),'MAY', cnt, null) MAY,
decode(to_char(expiry_date, 'MON'),'JUN', cnt, null) JUNE,
decode(to_char(expiry_date, 'MON'),'JUL', cnt, null) JULY,
decode(to_char(expiry_date, 'MON'),'AUG', cnt, null) AUGUST,
decode(to_char(expiry_date, 'MON'),'SEP', cnt, null) SEPTEMBER,
decode(to_char(expiry_date, 'MON'),'OCT', cnt, null) OCTOBER,
decode(to_char(expiry_date, 'MON'),'NOV', cnt, null) NOVEMBER,
decode(to_char(expiry_date, 'MON'),'DEC', cnt, null) DECEMBER
FROM ( select expiry_date,
to_char(expiry_date, 'DD'),
to_char(expiry_date, 'MON'),
count(expiry_date) cnt
FROM TABLE_X
group by to_char(expiry_date, 'DD'),
to_char(expiry_date, 'MON') )
WHERE expiry_date between (Trunc(Sysdate) - 963)
and (Trunc(Sysdate) - 598)
))
where RN=1;
WARNING: It runs like a dog, so execute it on a test system if possible!!