Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用来自2列的值_Sql Server - Fatal编程技术网

Sql server 使用来自2列的值

Sql server 使用来自2列的值,sql-server,Sql Server,我试图弄清楚如何进行一种“消费”查询,从另一个INT列(Y)减去一个INT值列(X),直到它达到0,然后停止。DesiredResult列和DesiredResultExplainion列仅用于参考正在执行的数学运算。这在描述日期顺序中发生(从未来到现在) 我最初的方法是使用窗口功能,但问题是一旦值(Y)达到0,它就需要停止执行运行总数。使用CTE也有类似问题 如果更改表结构会有所帮助,那么可以这样做 版本:SQL Server 2014或更高版本 谢谢 DECLARE @test TABLE

我试图弄清楚如何进行一种“消费”查询,从另一个INT列(Y)减去一个INT值列(X),直到它达到0,然后停止。DesiredResult列和DesiredResultExplainion列仅用于参考正在执行的数学运算。这在描述日期顺序中发生(从未来到现在)

我最初的方法是使用窗口功能,但问题是一旦值(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

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;

不确定什么是
没有留下任何要减法的内容
,然后你突然减法了。因为在您的示例中,column
Y
没有改变,请按描述顺序查看PeriodDate列。1100在5/29时消耗,并向后移动。当它达到5/8和5/1时,1100就被消耗掉了。希望这是合理的1100从哪里来?哦,是向后的?它是一个静态值(从预测中减去一个顺序)。在这个例子中,我只记下了1100。我忘记了使用滞后!这是我需要的基础工作。谢谢你,胡安!如果你看到编辑中的键是使用comulative
SUM
,我选择删除
LAG
,并且认为它很容易阅读
 WHEN accumulated - X < startY