如何在SQL Server 2012中计算运行总计

时间:2019-06-19 18:24:46

标签: sql-server tsql sql-server-2012 running-total

这是一份精算报告。 逻辑是计算有损失(在上面有损失日期)的策略的数量。

这是EffectiveMMYY,计数为PolicyNumbers。这是我们每月出售的保单数量。我只显示那些对此有主张的人。

enter image description here

我们不计算没有损失的保单。

这是LossMMYY(报告损失的月份,月份)的PolicyNumbers计数

enter image description here

我有

矩阵

EffectiveMMYY

LossMMYY

SUM(PolicyNumberCount)

enter image description here

如何计算EffectiveMMYY在SQL中的运行总计,因此结果将如下所示:

enter image description here

样本数据:

DECLARE @Table1 TABLE 
                (
                     ID INT, 
                     PolicyNumber VARCHAR(50),
                     EffectiveDate DATE,
                     LossDate DATE
                )

INSERT INTO @Table1 (ID, PolicyNumber, EffectiveDate, LossDate)
VALUES (1, 'Pol1', '2017-02-01',  '2017-02-05'),    
       (2, 'Pol2', '2017-03-04',   '2017-03-18'),   
       (3, 'Pol3', '2017-03-11', '2017-03-22'),
       (4, 'Pol4', '2017-03-11',  NULL),    
       (5, 'Pol5', '2017-03-15', '2017-04-22'),
       (6, 'Pol6', '2017-04-18', '2017-04-19'), 
       (7, 'Pol7', '2017-04-22', '2017-04-29'),
       (8, 'Pol8', '2017-04-15', '2017-04-18'), 
       (9, 'Pol9', '2017-12-15', '2018-01-23'),
       (10, 'Pol10', '2017-02-13', '2017-03-11'),
       (11, 'Pol11', '2017-02-18', '2017-03-22'),
       (12, 'Pol12', '2017-02-17', '2018-01-05'),
       (13, 'Pol13', '2017-05-28', '2017-05-30')

SELECT 
    ID, PolicyNumber,
    FORMAT(EffectiveDate, 'MMM') + '-'+ FORMAT(EffectiveDate, 'yy') AS  'EffectiveMMYY',
    FORMAT(LossDate, 'MMM') + '-'+ FORMAT(LossDate, 'yy') AS  'LossMMYY',
    1 AS PolicyNumberCount
FROM
    @Table1 
ORDER BY 
    EffectiveDate

上述查询的结果如下:

enter image description here

我尝试过:

count(PolicyNumber) OVER (partition BY MONTH(EffectiveDate), YEAR(EffectiveDate) order by EffectiveDate ) as runtotEffMonth,

但这没有给我正确的结果

1 个答案:

答案 0 :(得分:0)

with POL as (
select 
    FORMAT(EffectiveDate, 'yyyy-MM') aS  EffYYYYMM,
    FORMAT(LossDate, 'yyyy-MM') aS  LossYYYYMM
from @Table1
where lossdate is not null
)
select
    PE.EffYYYYMM,
    PL.LossYYYYMM,
    coalesce((
        select count(*)
        from pol p2
        where p2.EffYYYYMM = pE.EffYYYYMM
        and p2.LossYYYYMM <= pL.LossYYYYMM
    ), 0) as PolCount
from POL PE
cross join pol PL
group by 
    PE.EffYYYYMM,
    PL.LossYYYYMM 
order by 1,2
相关问题