使用 SQL 服务器窗口函数获取 运行 会计年度总数

Using SQL Server windowing function to get running total by fiscal year

我正在使用 SQL Server 2014。我有一个 Claims table 包含我系统中每月提出的索赔总数:

+-----------+-------------+------------+
| Claim_ID  | Claim_Date  | Nett_Total |
+-----------+-------------+------------+
| 1         | 31 Jan 2012 |  321454.67 |
| 2         | 29 Feb 2012 |  523542.34 |
| 3         | 31 Mar 2012 |   35344.33 |
| 4         | 30 Apr 2012 |  142355.63 |
| etc.      | etc.        | etc.       |
+-----------+-------------+------------+

对于我正在撰写的报告,我需要能够生成在每个财政年度开始时重置为零的累计 运行 总数(在我的国家/地区,这是从 3 月 1 日到 2 月 28 日/次年 29 日)。

该报告看起来与 table 类似,有一个额外的 运行 总计列,类似于:

+-----------+-------------+------------+---------------+
| Claim_ID  | Claim_Date  | Nett_Total | Running Total |
+-----------+-------------+------------+---------------+
| 1         | 31 Jan 2012 |  321454.67 |     321454.67 |
| 2         | 29 Feb 2012 |  523542.34 |     844997.01 |
| 3         | 31 Mar 2012 |   35344.33 |      35344.33 | (restart at 0
| 4         | 30 Apr 2012 |  142355.63 |     177699.96 |  for new yr) 
| etc.      | etc.        | etc.       |               |
+-----------+-------------+------------+---------------+

我知道窗口函数非常强大,我过去以基本的方式使用它们来获得总和和平均值,同时避免需要对结果集行进行分组。我有一种直觉,我需要使用 'preceding' 关键字来获取每一行所属的当前财政年度的 运行 总数,但我不太明白如何将财政年度表达为在 'preceding' 子句中使用的概念(或者如果确实有可能以这种方式使用日期范围)。

"phrasing" "preceding" 条款财政年度的任何帮助都将对我有很大帮助。

我认为你应该试试这个:

/* Create Table*/
CREATE TABLE dbo.Claims (
 Claim_ID int
,Claim_Date datetime
,Nett_Total decimal(10,2)
);

/* Insert Testrows*/
INSERT INTO dbo.Claims VALUES 
 (1, '20120101', 10000)
,(2, '20120202', 10000)
,(3, '20120303', 10000)
,(4, '20120404', 10000)
,(5, '20120505', 10000)
,(6, '20120606', 10000)
,(7, '20120707', 10000)
,(8, '20120808', 10000)

查询数据:

SELECT  Claim_ID, Claim_Date, Nett_Total, SUM(Nett_Total) OVER
(PARTITION BY YEAR(DATEADD(month,-2,Claim_Date)) ORDER BY Claim_ID) AS
[Running Total] FROM dbo.Claims

诀窍:PARTITION BY YEAR(DATEADD(month,-2,Claim_Date))

按年份新建分区,但我更改了日期以适合您的财政年度。

输出:

Claim_ID |Claim_Date                 |Nett_Total  |Running Total
---------+---------------------------+------------+-------------
1        |2012-01-01 00:00:00.000    |10000.00    |10000.00
2        |2012-02-02 00:00:00.000    |10000.00    |20000.00
3        |2012-03-03 00:00:00.000    |10000.00    |10000.00   <- New partition
4        |2012-04-04 00:00:00.000    |10000.00    |20000.00
5        |2012-05-05 00:00:00.000    |10000.00    |30000.00
6        |2012-06-06 00:00:00.000    |10000.00    |40000.00
7        |2012-07-07 00:00:00.000    |10000.00    |50000.00
8        |2012-08-08 00:00:00.000    |10000.00    |60000.00