I wrote this for a similar purpose, you may be able to mess about with it to get what you are after...

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!!