sql - 计算运行总计 - 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;
解决方案
试试这个:
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 将查询结果集划分为分区。窗口函数分别应用于每个分区,并为每个分区重新开始计算。
推荐阅读
- ios - Apple Business Chat 中richLinkData 的有效负载是什么
- python - 如果在循环内调用的函数执行时间过长,如何在 python 中跳过循环迭代?
- javascript - 无法迭代多个 JSON 值
- python - API tensorflow 检测 Faster RCNN with FPN
- typescript - 为什么这个对象类型的key是数字或字符串?
- java - JPA多对多删除实体
- c++ - 如何从自定义对话框工具栏属性页中隐藏 CMFCToolBar?
- python - Python/Numpy 是否有一个与 argsort 相反的函数,它用该元素在排序数组中的位置填充数组?
- excel - 如何在 DAX 公式度量中添加 if 语句?
- openvswitch - ryu-manager 的 --observe-links 选项在交换机上生成“未知版本 (0x04)”