我的查找表数据如下所示:数据库是SQL Server。
policy_number | policy_eff_dt | lob_cd | 车辆数量 |
---|---|---|---|
1234 | 2022-10-12 | 自动 | 5 |
1234 | 2021-10-12 | 自动 | 6 |
1234 | 2020-10-12 | 自动 | 3 |
1234 | 2019-10-12 | 自动 | 2 |
我的源表提供以下过滤列:Policy_number、policy_eff_dt、LOB_CD
如果传入(源)值为policy_number=1234、policy_eff_dt=2022-10-12、loc_cd=AUTO
那么我应该确定前三年(2021,2020,2019)并将 (6+3+2) = 11 总结为 PREV3_TOTAL_NBR_OF_VEHICLES。
我的过滤条件是
in_policy_number = policy_number and
in_policy_eff_dt <= policy_eff_dt and
in_lob_cd = lob_cd
这样我就得到了2021年、2020年和2019年)
我考虑过使用子查询来获取前 3 年的行。我这里需要一些帮助。
有没有办法编写一个查询来计算车辆总数?
注意:这是开发的初始查询:
select
policy_num, lob_cd, sum(number_of_vehicles)
from table1
where policy_num='S 2455350'
and lob_cd = 'AU'
and year(policy_eff_dt) >= '2022'-3
and year(policy_eff_dt) <= '2022'
group by policy_num , lob_cd
新 SQL:
select A.policy_num, A.lob_cd, (NUM1+NUM2+NUM3) as PREV3_NUMBER_OF_VEHICLES from (select policy_num, lob_cd, case when year year (curr.policy_eff_dt) - year (prev.policy_eff_dt) =1
then prev.number_of_vehicles else 0 end) as NUM1, case when year year (curr.policy_eff_dt) - year (prev.policy_eff_dt) =2
then prev.number_of_vehicles else 0 end) as NUM2, case when year year (curr.policy_eff_dt) - year (prev.policy_eff_dt) =3
then prev.number_of_vehicles else 0 end) as NUM3, from table1 curr
left join table1 prev on curr.policy_num=prev.policy_num and curr.lob_cd = prev.lob_cd where curr.policy_num='S 2455350'
and curr.lob_cd = 'AU' ) A
您可以使用
APPLY
运算符来获取前 3 年的 SUM。我在下面给出了一个工作示例来给出一个想法。
仅当恰好有 3 个前几年可用时,列 strict_prev3_total_nbr_of_vehicles 才会给出 SUM,并且列 prev3_total_nbr_of_vehicles 将给出前 3 年的 SUM(无论是否可用)。
drop table if exists table1
go
create table table1 (
policy_number int,
policy_eff_dt date,
lob_cd char(4),
Number_of_vehicles int)
go
INSERT into table1
values (1234, '2022-10-12', 'AUTO', 5),
(1234, '2021-10-12', 'AUTO', 6),
(1234, '2020-10-12', 'AUTO', 3),
(1234, '2019-10-12', 'AUTO', 2)
GO
select a.*,
prev3_total_nbr_of_vehicles,
case
when p.total_prev_years = 3 then p.prev3_total_nbr_of_vehicles
else 0 end strict_prev3_total_nbr_of_vehicles
from table1 a
outer apply ( select sum(Number_of_vehicles) prev3_total_nbr_of_vehicles,
count(1) total_prev_years
from table1 b
where a.policy_number = b.policy_number
and a.lob_cd = b.lob_cd
and YEAR(b.policy_eff_dt) BETWEEN YEAR(a.policy_eff_dt) - 3 and YEAR(a.policy_eff_dt) - 1) p
GO