i had previously asked for help writing/improving a function that i need to calculate a premium based on differing values for each month. the premium is split in to 12 months and earned on a percentage for each month. so if the policy start in march and we are in jan we will have earned 10 months worth. so i need to add up the monthly earning to give us the total earned. wach company wil have differeing earnings values for each month. 
my original code is Here. its ghastly and slow hence the request for help.
and i was presented with the following code. the code works but returns stupendously large figures. 
begin
set @begin=datepart(month,@outdate)
set @end=datepart(month,@experiencedate)
;with a as
(
    select *,
    case calmonth
        when 'january' then 1
        when 'february' then 2
        when 'march' then 3
        when 'april' then 4
        when 'may' then 5
        when 'june' then 6
        when 'july' then 7
        when 'august' then 8
        when 'september' then 9
        when 'october' then 10
        when 'november' then 11
        when 'december' then 12
        end as Mnth
        from tblearningpatterns
        where clientname=@client
            and earningpattern=@pattern
    )
    ,
    b as
    (
        select
            earningvalue,
            Mnth,
            earningvalue as Ttl
        from a
        where Mnth=@begin
        union all
        select
            a.earningvalue,
            a.Mnth,
            cast(b.Ttl*a.earningvalue as decimal(15,3)) as Ttl
        from a
            inner join b
                on a.Mnth=b.Mnth+1
        where a.Mnth<=@end
    )
    select @earningvalue=
        Ttl
    from b
        inner join
        (
            select max(Mnth) as Mnth
            from b
        ) c
            on b.Mnth=c.Mnth
    option(maxrecursion 12)
    SET @earnedpremium =  @earningvalue*@premium 
end
can someone please help me out?