Sql server SQL 2列的累积和

Sql server SQL 2列的累积和,sql-server,Sql Server,输入: 我必须设置的条件是: | ID | Class | SubDate | RecDate | SubAmt| RecAmt| -------------------------------------------------------- | 1 | 123| 23/08/15 | 15/10/2015| 12710 | 10613 | | 2 | 123| 23/09/15 | NULL | 12710 | NULL | | 3 |

输入:

我必须设置的条件是:

| ID |    Class | SubDate  | RecDate   | SubAmt| RecAmt|
--------------------------------------------------------
|  1 |       123| 23/08/15 | 15/10/2015| 12710 | 10613 |
|  2 |       123| 23/09/15 | NULL      | 12710 | NULL  |
|  3 |       123| 23/10/15 | NULL      | 2096  | NULL  |
|  4 |       123| 23/11/15 | NULL      |  917  | NULL  |
|  5 |       123| 23/12/15 | NULL      |  917  | NULL  |
|  6 |       123| 23/01/16 | 03/03/2016| 83913 | 78416 |
|  7 |       123| 23/02/16 | 19/04/2016| 267688| 168507|
|  8 |       123| 23/03/16 | 24/05/2016| 217168| 10891 |
|  9 |       123| 25/04/16 | NULL      | 48661 | NULL  |
| 10 |       123| 25/05/16 | 04/07/2016| 67824 | 47921 |
| 11 |       123| 23/06/16 | 07/08/2016|111612 | 35782 |
| 12 |       123| 25/07/16 | NULL      | 63691 | NULL  |
| 13 |       123| 25/08/16 | NULL      | 30688 | NULL  |
| 14 |       123| 25/09/16 | NULL      | 30688 | NULL  |
| 15 |       224| 26/05/16 | 25/07/2016| 41325 | 33075 |
| 16 |       224| 20/06/16 | 29/08/2016| 41325 | 5875  |
| 17 |       224| 20/07/16 | NULL      | 41325 | NULL  |
| 18 |       224| 18/08/16 | NULL      | 8250  | NULL  |
| 19 |       224| 20/09/16 | NULL      | 2375  | NULL  |
--------------------------------------------------------
例1: 正如您可以从所需的输出中看到的

对于ID 1:2015年8月23日(ID 1的子日期)<2015年10月15日(ID 1的重新日期)。因此,ID 1的累积值=12710(ID 1的子MT)

例2: 对于ID 3:2015年10月23日(ID 3的子日期)>2015年10月15日(ID 1的重新日期)。因此,ID 3的累积值=2096(ID 3的子批次)+10613(ID 1的重新批次)=12710

例3: 对于ID 8,2016年3月23日(ID 8的子日期)>ID 1和ID 6的重新日期 2015年10月15日(ID 1的记录日期) 2016年3月3日(ID 6的记录日期)

因此,ID 8的累积值为:217168(ID 3的子MT)+10613(ID 1)+78416(ID 6)=306197

期望输出:

CASE WHEN SubDate > RecDate THEN (SubAmt + RecAmt) 
ELSE SubAmt 
END AS Cumulative
请告知

我试过这个:

| ID |    Class | SubDate  | RecDate   | SubAmt| RecAmt| Cumulative
-------------------------------------------------------------------
|  1 |       123| 23/08/15 | 15/10/2015| 12710 | 10613 | 12710 
|  2 |       123| 23/09/15 | NULL      | 12710 | NULL  | 12710 
|  3 |       123| 23/10/15 | NULL      | 2096  | NULL  | 12710 
|  4 |       123| 23/11/15 | NULL      |  917  | NULL  | 11530
|  5 |       123| 23/12/15 | NULL      |  917  | NULL  | 11530
|  6 |       123| 23/01/16 | 03/03/2016| 83913 | 78416 | 94527
|  7 |       123| 23/02/16 | 19/04/2016| 267688| 168507| 278302
|  8 |       123| 23/03/16 | 24/05/2016| 217168| 10891 | 306197
|  9 |       123| 25/04/16 | NULL      | 48661 | NULL  | 306197
| 10 |       123| 25/05/16 | 04/07/2016| 67824 | 47921 | 336252
| 11 |       123| 23/06/16 | 07/08/2016|111612 | 35782 | 380040
| 12 |       123| 25/07/16 | NULL      | 63691 | NULL  | 380040
| 13 |       123| 25/08/16 | NULL      | 30688 | NULL  | 382820
| 14 |       123| 25/09/16 | NULL      | 30688 | NULL  | 382820
| 15 |       224| 26/05/16 | 25/07/2016| 41325 | 33075 | 41325
| 16 |       224| 20/06/16 | 29/08/2016| 41325 | 5875  | 41325
| 17 |       224| 20/07/16 | NULL      | 41325 | NULL  | 41325
| 18 |       224| 18/08/16 | NULL      | 8250  | NULL  | 41325
| 19 |       224| 20/09/16 | NULL      | 2375  | NULL  | 41325
--------------------------------------------------------------
但它不起作用,反而给了我一个不符合要求的输出

错误输出:

SELECT [ID]
,[Class]
,[SubDate]
,[RecDate]
,[SubAmt]
,[RecAmt]
,SUM (CASE 
        WHEN SubDate  > RecDate  or RecDate   IS NULL THEN (SubAmt + RecAmt)  
        ELSE SubAmt  END ) OVER (PARTITION BY [Class] ORDER BY [ID] ROWS 
BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Cumulative
FROM TableName

请帮助我建议如何更改SQL代码以及如何适应case语句。谢谢大家

RecDate
NULL
时,
SubDate>RecDate
条件将失败,因为
NULL
未知且无法与任何值进行比较

试试这样的

| ID |    Class | SubDate  | RecDate   | SubAmt| RecAmt| Cumulative (Wrong Output)
--------------------------------------------------------------------------
|  1 |       123| 23/08/15 | 15/10/2015| 12710 | 10613 | 12710
|  2 |       123| 23/09/15 | NULL      | 12710 | NULL  | 12710
|  3 |       123| 23/10/15 | NULL      | 2096  | NULL  | 12710
|  4 |       123| 23/11/15 | NULL      |  917  | NULL  | 12710
|  5 |       123| 23/12/15 | NULL      |  917  | NULL  | 12710
|  6 |       123| 23/01/16 | 03/03/2016| 83913 | 78416 | 96623
|  7 |       123| 23/02/16 | 19/04/2016| 267688| 168507| 364312
|  8 |       123| 23/03/16 | 24/05/2016| 217168| 10891 | 581480
|  9 |       123| 25/04/16 | NULL      | 48661 | NULL  | 581480
| 10 |       123| 25/05/16 | 04/07/2016| 67824 | 47921 | 649304
| 11 |       123| 23/06/16 | 07/08/2016|111612 | 35782 | 760917
| 12 |       123| 25/07/16 | NULL      | 63691 | NULL  | 760917
| 13 |       123| 25/08/16 | NULL      | 30688 | NULL  | 760917
| 14 |       123| 25/09/16 | NULL      | 30688 | NULL  | 760917
| 15 |       224| 26/05/16 | 25/07/2016| 41325 | 33075 | 41325
| 16 |       224| 20/06/16 | 29/08/2016| 41325 | 5875  | 82650
| 17 |       224| 20/07/16 | NULL      | 41325 | NULL  | 82650
| 18 |       224| 18/08/16 | NULL      | 8250  | NULL  | 82650
| 19 |       224| 20/09/16 | NULL      | 2375  | NULL  | 82650
--------------------------------------------------------------

'因此,只有当您的计算器非常糟糕时,ID 3的累积=2096(ID 3的子MT)+10613(ID 1的重新计算)=12710'。实际上,在某些数量之后应该有小数,但我将其删掉以便于查看数据。希望您理解至少会有+-1的差异。谢谢,谢谢你的建议。然而,正如上面提到的“错误的输出:”部分,我已经尝试了您的解决方案,并且输出仍然与预期的输出有点远。
SUM(CASE WHEN SubDate > RecDate or RecDate IS NULL THEN (SubAmt + RecAmt) 
ELSE SubAmt 
END AS Cumulative) OVER(PARTITION BY [Class] ORDER BY [ID] ROWS BETWEEN 
UNBOUNDED PRECEDING AND CURRENT ROW)