2017-04-10 45 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

好,所以你得到了答案 –