I'm assuming the actual data does not match your sample data, since there's no way to sum any combination of 2, 4, 6 and 10 and get 23.
Your baseprc query will force all RET_PRC to the value of a single sku_num, though the table structure implies they could vary.
The GM_INV_LOC table is a little suspect. For example, if when avail_qty is zero, does a record appear?
In my experience (long-running queries), user-defined functions are to be tried just before wrist-slashing. Can you use an analytic function?
Try something like this (not tested):
select gm_itm.itm_cd,gm_sku.sku_num,color_des,
LAST_VALUE (gm_prc.ret_prc) OVER (PARTITION BY gm_prc.sku_num ORDER BY gm_prc.beg_dt) last_prc, sum(avail_qty) tot_avail
from gm_inv_loc, gm_sku, gm_itm
where gm_itm.itm_cd = '000000848'
and gm_itm.itm_cd=gm_sku.itm_cd
and gm_sku.sku_num=gm_inv_loc.sku_num(+) --outer join on gm_inv_loc
group by gm_itm.itm_cd,gm_sku.sku_num,color_des
Index on gm_prc.sku_num, gm_prc.beg_dt helpful