SQL:自B.field中的最后一个值以来累积的A.field?

时间:2017-04-10 08:44:56

标签: sql-server

上下文 - 我对SQL很陌生。我得到了基础知识,并且围绕着基本的连接,但我还没有完全建立自己的基本选择之外的查询。 我有以下表格布局:

Site  Date         Cash_1      Sales_1
4     10/04/2017   £1,500      £1,500
4     09/04/2017   NULL        £1,000
4     08/04/2017   NULL        £2,000
4     07/04/2017   NULL        £1,000
4     06/04/2017   £5,000      £1,000

如您所见,本网站06/04至09/04之间的(示例)累计销售总额为06/04的现金金额。
这种情况发生在网站4未能及时上传其现金声明时 - 后续日期汇总在一个单独的声明中,该声明的日期为无法上传的第一天。

我希望尝试获得的内容如下所示。我们的想法是累积列将显示自上次成功导入现金报表以来的总销售额,这将有助于进行余额检查。

Site  Date         Cash_1      Sales_1   Cumulative
4     10/04/2017   £1,500      £1,500    £1,500
4     09/04/2017   NULL        £1,000    £5,000
4     08/04/2017   NULL        £2,000    £4,000
4     07/04/2017   NULL        £1,000    £2,000
4     06/04/2017   £5,000      £1,000    £1,000

我可以使用" SUM(Y)作为X"在标准意义上创建一个累积列,但我无法根据其他列值重新设置如何重置累积。

1 个答案:

答案 0 :(得分:1)

尝试使用 ROW_NUMBER()更新声明,如下所示:

DECLARE @tblTest as Table(
    SiteNo INT,
    [Date] Date,
    Cash INT,
    Sales INT
)

INSERT INTO @tblTest VALUES(4,'10-Apr-2017',1500,1500)
INSERT INTO @tblTest VALUES(4,'09-Apr-2017',NULL,1000)
INSERT INTO @tblTest VALUES(4,'08-Apr-2017',NULL,2000)
INSERT INTO @tblTest VALUES(4,'07-Apr-2017',NULL,1000)
INSERT INTO @tblTest VALUES(4,'06-Apr-2017',5000,1000)

;With T AS
(
    SELECT
        *,
        NULL AS Cumulative,
        ROW_NUMBER() OVER(ORDER BY Date) AS RowNo
    FROM @tblTest   
)
SELECT
    *
INTO #tblTest
FROM T
ORDER BY RowNo  

DECLARE @sum INT=0

Update #tblTest
SET @sum=Cumulative=Sales+ CASE WHEN Cash IS NULL THEN @sum ELSE 0 END 

SELECT * FROM #tblTest ORDER BY RowNo DESC 

DROP TABLE #tblTest