Как рассчитать промежуточный итог в SQL Server 2012 - PullRequest
0 голосов
/ 19 июня 2019

Это актуарный отчет.Логика заключается в том, чтобы рассчитать количество политик, у которых есть потери (с датой потери).

Это EffectiveMMYY и количество PolicyNumbers.Это количество полисов, которые мы продали каждый месяц.Я показываю только те, которые имеют претензии на это.

enter image description here

Мы не учитываем Политики, в которых нет потерь.

И это Количество номеров политик по LossMMYY (месяц, когда была зарегистрирована потеря)

enter image description here

У меня есть матрица с

Строки : EffectiveMMYY,

Столбцы : LossMMYY,

Значение : SUM(PolicyNumberCount)

enter image description here

Как рассчитать итоговую сумму в SQL для EffectiveMMYY, чтобы результат выглядел следующим образом:

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 голосов
/ 27 июня 2019
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
...