首页 > 解决方案 > 计算运行总计 - TSQL?

问题描述

我正在尝试计算一个时间段内的运行总数,每个时间段都会累积到下一个时间段以获得累积总数。

真实数据中会有多个事件以及多种事件类型和成本类型 - 但在下面的示例中,我只显示一个事件和一种类型。如果我能让它工作,我也可以让它适用于其他类型。

下面的屏幕截图是我的预期输出:

在此处输入图像描述

我想将两种准备金的每个月的金额相加:费用和赔偿 - 所以第 1 个月的总额为 31.7k 美元。第 2 个月的总额约为 4.1k 美元,因此这将添加到前几个月的总额中,给我 35.9k 美元。这个运行总数应该会持续到最后一个记录。

我正在尝试各种方法来通过窗口函数求和,但到目前为止我无法获得预期的结果。关于如何达到这个总数的任何建议?

样本数据如下:

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;

标签: sqltsqlsql-server-2016

解决方案


试试这个:

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 将查询结果集划分为分区。窗口函数分别应用于每个分区,并为每个分区重新开始计算。

参考

SQL 小提琴


推荐阅读