2017-03-28 28 views
1

我想弄清楚如何做一種「消費」查詢,其中INT值列(X)從另一個INT列(Y)中減去,直到它達到0,然後停止。 DesiredResult和DesiredResultExplanation這一列僅用於參考正在執行的數學。這發生在DESC日期順序(未來消耗回當前)從2欄消費值

我最初的方法是使用窗口功能,但問題是一旦值(Y)達到0,它需要停止執行運行總數。使用CTE也有類似的問題。

如果更改表格結構將有所幫助,可以這樣做。

版本:SQL Server 2014或更高版本

謝謝!

DECLARE @test TABLE 
(
ID INT IDENTITY (1,1) 
,PeriodDate DATE 
,X INT 
,Y INT 
,DesiredResult INT 
,DesiredResultExplanation VARCHAR(100) 
) 

INSERT INTO @test VALUES ('2017-05-01', 100,0, 100,'Nothing left to subtract. Value is unchanged') 
INSERT INTO @test VALUES ('2017-05-08', 200,0, 200,'Nothing left to subtract. Value is unchanged') 
INSERT INTO @test VALUES ('2017-05-15', 300,0, 100,'300 - 200 = 100 (Orig -1100 has been consumed)') 
INSERT INTO @test VALUES ('2017-05-22', 400,0,-200,'400 - 600 = -200 ') 
INSERT INTO @test VALUES ('2017-05-29', 500,-1100,-600, '500 - 1100 = -600') 

SELECT * 
FROM @test 
ORDER BY PeriodDate DESC 
+0

不知道什麼是'沒有什麼可以減少',突然你減少。因爲在您的示例中,列'Y'不會更改 –

+0

請按照DESC順序查看列PeriodDate。 1100在5/29被消耗並且向後移動。當它達到5/8和5/1時,1100被消耗。希望有道理 – Kirby1367

+0

1100哪裏來? –

回答

3

DEMO

WITH cte as (
    SELECT *, 
      SUM(X) OVER (ORDER BY PeriodDate DESC) accumulated 
    FROM @test 
), parameter as (
    SELECT 1100 as startY 
)  
SELECT *, 
     CASE WHEN accumulated <= startY 
      THEN accumulated - startY 
      WHEN LAG(accumulated) OVER (ORDER BY PeriodDate DESC) < startY 
      THEN accumulated - startY 
      ELSE X 
     END as newDesire 
FROM cte 
CROSS JOIN parameter 
ORDER BY PeriodDate DESC; 

輸出

​​

編輯:您可以更改LAG條件與

WHEN accumulated - X < startY 
+0

我忘了使用LAG!這是我需要的基礎。謝謝胡安! – Kirby1367

+0

好,如果你看到的關鍵是使用comulative'SUM'編輯我選擇刪除'LAG'並認爲很容易閱讀 –