我正在尝试编写一个将行插入临时表的过程。该表的基础是一份保险单表,列出了在政策生命周期内获得的保费金额。原始数据包含trans_date(已售出日期)以及policy_start和policy_end日期。即如果保单是12个月,我们每个月给出收取的保费的1/12。
类似
while trans_month < policy_end month
insert to tblUEPtmp
select dateadd(mm, 1, trans_date), earned_premium from tblpolicys
set trans_date = dateadd(mm, 1, trans_date)
(我知道这是rubbush代码,但我现在完全感到困惑)
我的问题是我需要创建额外的11行数据并修改交易日期,每次增加1个月,直到修改后的交易日期= policy_end日期。
我已经研究过使用CTE,但是虽然循环在CTE中是不可能的。
这是多语句表功能可以做的事吗?
非常感谢。
答案 0 :(得分:3)
您可以使用CTE进行defo,例如,这个小片段将演示如何使用日期进行递归:
declare @start DATETIME = '2012-02-01'
declare @end DATETIME = '2013-02-01'
;with cte (date)
AS
(
SELECT @start
UNION ALL
SELECT DATEADD(mm,1,cte.date)
FROM cte WHERE DATEADD(mm,1,cte.date)<@end
)
select * from cte
这将生成@start
&amp;之间的日期列表。 @end
月份差距。
你可以
insert into...select ... from cte
以插入所需数据如果您可以提供有关表模式的更多详细信息,我可以帮助您提供更具体的示例。
答案 1 :(得分:1)
这样的东西?
set @trans_date = ...
while @trans_date < @policy_end
begin
insert to tblUEPtmp
select trans_date, earned_premium
from tblpolicys
where {whatever}
set @trans_date = dateadd(mm, 1, @trans_date)
end