This is basic ASO functionality 101. You need to reed the DBAG. You could also look at the recent thread https://forums.oracle.com/thread/2580076 where it was explained.
Basically unlike BSO you CANNOT have a formula that runs at level 0 and then expect all levels above to roll the calculated number up - ASO just does not do that. Your only choice is to do it in the sql that produces the load file or in an ASO Calculation script.
What DanPressman said is absolutely right.
You don't have to specify level0 as that will only calculate on level0 and it is not the right way of doing it.
As i see your formula, you are just pulling the data from Last Year Budget / Last Year Abs. When you do not mention "islevel ([time].currentmember,0)", it will calculate for the member that is on your retrieve (it could be month, year whatever).
Can you try below
case when IsEmpty([PY_PER]) and IsEmpty([PY_PER_REVENUE]) Then ([Last Year Budget (Abs)]) else ([Last Year (Abs)]) end
I think the problem is in
That is why the Month is working and likely the week will work too. Maybe you have to work with descendants and not just take the children. It is dynamic so the children of Year are Quarters and they do not have data because this is stored at lev0.