SELECT q_tab.v_val month_no, DECODE(GREATEST(q_tab.v_val,4), q_tab.v_val, DECODE(GREATEST(q_tab.v_val,7), q_tab.v_val, DECODE(GREATEST(q_tab.v_val,10), q_tab.v_val,4,3),2),1) Quarter FROM (SELECT LEVEL v_val FROM DUAL CONNECT BY LEVEL <=12) q_tab; -- For months greater than 12 this query splits months into -- q1 -> 1-3 -- q2 -> 4-6 -- q3 -> 7-9 -- q4 -> 10-12 -- using MOD(months, 12) SELECT q_tab.v_month month_no, DECODE(q_tab.v_val,0, 4, DECODE(GREATEST(q_tab.v_val,4), q_tab.v_val, DECODE(GREATEST(q_tab.v_val,7), q_tab.v_val, DECODE(GREATEST(q_tab.v_val,10), q_tab.v_val,4,3),2),1)) Quarter FROM (SELECT LEVEL v_month, MOD(LEVEL,12) v_val FROM DUAL CONNECT BY LEVEL <= &i_months) q_tab ;