2017-04-10 41 views
0

上下文 - 我对SQL很陌生。我掌握了基本知识,并且对基本连接有了自己的头脑,但是我并没有在基本选择之外构建自己的查询。 我有以下表格布局:SQL:从B.field中的最后一个值开始累积A.field?

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

尝试用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 
+0

这似乎很好地为一个单一的网站工作,并给了我一个很好的起点,进一步尝试,谢谢。如果多个网站位于同一个表格中,它无法正确跟踪,但我会四处游戏,看看我现在能不能解决问题。 –

+0

只是为了更新,编辑ROW_NUMBER()子句按SiteNo排序Date ASC给了我很好的需求。 –

+0

好,所以你得到了答案 –