计算过去三年的车辆总数

问题描述 投票:0回答:1

我的查找表数据如下所示:数据库是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
sql sql-server sql-server-2012
1个回答
0
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.