Расчет промежуточных итогов - TSQL? - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь рассчитать промежуточные итоги за период времени, в котором каждый период времени сворачивается в следующий период для совокупного итога.

В реальных данных будет несколько событий наряду с несколькими типами событий итипы стоимости - но в приведенном ниже примере я показываю только одно событие и один тип.Если я смогу заставить это работать, я могу заставить его работать и для других типов.

На снимке экрана ниже показан мой ожидаемый результат:

enter image description here

Я хотел бы суммировать суммы для номера каждого месяца для обоих типов резервов: Расходы и возмещение - таким образом, на 1-й месяц будет в общей сложности 31,7 тыс. Долларов.Месяц 2 имеет в общей сложности около 4,1 тыс. Долларов США, так что это будет добавлено к сумме предыдущих месяцев, что даст мне 35,9 тыс. Долларов.И эта промежуточная сумма должна продолжаться до последней записи.

Я пытаюсь различными способами суммировать с помощью оконной функции, но пока не могу получить ожидаемый результат.Любые предложения о том, как этого достичь?

Пример данных приведен ниже:

CREATE TABLE #temptable
( Catastrophe VARCHAR (60), Type VARCHAR (256), CostType VARCHAR (256), FirstLossDate DATE, MonthNumber INT, Amount DECIMAL (38, 6) );

INSERT INTO #temptable
( Catastrophe, Type, CostType, FirstLossDate, MonthNumber, Amount) 
VALUES
('Hurricane Humberto', 'Reserve', 'Expense - A&O', N'2007-09-13', 1, 13460.320000),
('Hurricane Humberto', 'Reserve', 'Indemnity', N'2007-09-13', 1, 18314.610000),
('Hurricane Humberto', 'Reserve', 'Expense - A&O', N'2007-09-13', 2, -1589.340000),
('Hurricane Humberto', 'Reserve', 'Indemnity', N'2007-09-13', 2, 5750.000000),
('Hurricane Humberto', 'Reserve', 'Expense - A&O', N'2007-09-13', 3, -2981.250000),
('Hurricane Humberto', 'Reserve', 'Indemnity', N'2007-09-13', 3, -10000.000000),
('Hurricane Humberto', 'Reserve', 'Expense - A&O', N'2007-09-13', 4, 0.000000),
('Hurricane Humberto', 'Reserve', 'Indemnity', N'2007-09-13', 4, 0.000000),
('Hurricane Humberto', 'Reserve', 'Expense - A&O', N'2007-09-13', 5, 0.000000),
('Hurricane Humberto', 'Reserve', 'Indemnity', N'2007-09-13', 5, 0.000000);

SELECT Catastrophe,
       Type,
       CostType,
       FirstLossDate,
       MonthNumber,
       Amount,
       SUM ( Amount ) OVER (PARTITION BY Catastrophe, MonthNumber, Type ORDER BY MonthNumber ROWS UNBOUNDED PRECEDING  ) AS RunningTotals,
       SUM ( Amount ) OVER (PARTITION BY Catastrophe, Type, MonthNumber) AS RunningTotal2
FROM #temptable
ORDER BY Catastrophe,
         Type,
         MonthNumber;

DROP TABLE #temptable;

1 Ответ

1 голос
/ 19 сентября 2019

Попробуйте это:

SELECT Catastrophe,
       Type,
       CostType,
       FirstLossDate,
       MonthNumber,
       Amount,
       SUM(Amount) OVER (PARTITION BY Catastrophe, Type ORDER BY MonthNumber asc RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS RunningTotals
FROM 
       temptable
ORDER BY 
       Catastrophe,
       Type,
       MonthNumber;

Я думаю, что ваша основная проблема была с предложением partition by - оно предназначено для "сброса" расчета - так что вы можете вычислить функцию управления окнами для многих групп.

Согласно документации:

PARTITION BY Делит набор результатов запроса на разделы.Оконная функция применяется к каждому разделу отдельно, и вычисления перезапускаются для каждого раздела.

REF

SQL FIDDLE

...