1

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

+-----------+-------------+------------+
| 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 日)。

该报告将与表格类似,但有一个额外的运行总计列,例如:

+-----------+-------------+------------+---------------+
| 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' 子句(或者如果确实可以以这种方式使用日期范围)。

请在为“前项”条款“措辞”财政年度的方式上提供任何帮助,对我有很大帮助。

4

1 回答 1

2

我认为你应该试试这个:

/* 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
于 2016-12-05T15:54:55.233 回答