我以前曾要求帮助编写/改进我需要根据每个月的不同值计算溢价的功能。保费分为12个月,每个月按百分比计算。因此,如果政策从三月开始,我们在jan,我们将获得10个月的价值。所以我需要将每月收入加起来给我们总收入。 wach公司每个月都会有不同的收益值。
我原来的代码是Here。它的可怕和缓慢因此请求帮助。
我看到了以下代码。代码可以工作,但是返回了很大的数字。
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
有人可以帮帮我吗?
答案 0 :(得分:1)
这是因为收益正在乘以递归CTE的收益。 b.Ttl * a.earningvalue
这个查询似乎是错误的......只是从它看来它会让你说你从一年到下一年。作为例子,月份从12变为1
我会创建一个递归CTE,它基本上使用你的开始日期锚定,然后在联合之后的部分中我将1 $ onth添加到Datetime直到它超过结束日期