This might be one possibility.
But, it might be completely wrong(not meet with your requirement),
because of your too little published information.
At least, sample/test data of three tables(with enough number of rows)
and expected result from the data should be provided.
Example 1: one possibility. might be completely wrong.
Code:
SELECT TO_CHAR(ADD_MONTHS(eoa.Date_seen , -3) , 'YYYY') AS YEAR
, TO_CHAR(ADD_MONTHS(eoa.Date_seen , -3) , 'MM' ) AS MONTH
, eoa.TREATMENT_FUNC AS Treatment_Function
, eoa.Local_Subspecialty AS Local_Specialty
, ee .DOCTOR_NO AS cons_code
, rb .Code AS Agegroup
FROM Op_Attendance eoa
LEFT OUTER JOIN
Enc_Epi ee
ON ee .Enc_No = eoa.Enc_No
AND ee .Episode_No = eoa.Episode_No
LEFT OUTER JOIN
cfis_data.Ref_Bands rb
ON FLOOR( (eoa.Date_Seen - ee.Date_Of_Birth) / 365.25 )
BETWEEN rb.Low_Value
AND rb.High_Value
AND rb .Domain = 'CIMTAGE2'
WHERE eoa.Date_Seen
BETWEEN to_date('01/11/2010' , 'DD/MM/YYYY')
AND to_date('30/11/2010' , 'DD/MM/YYYY')
;