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 给定最终值的存货重新计算_Sql_Sql Server_Tsql_Sql Server 2014 - Fatal编程技术网

Sql 给定最终值的存货重新计算

Sql 给定最终值的存货重新计算,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我正在编写一个SQL Server脚本,根据实际库存,从今天开始重新计算过去365天内特定SKU的库存。在scrip中,我做了很多数据清理操作。最后,从临时表生成输出,如下所示: SELECT DATE, SUM(CASE WHEN MOV='IN' THEN 1 ELSE 0 END) AS TRANSACTION_IN, --COUNT TRANSACTIONS IN SUM(CASE WHEN MOV='OUT' THEN 1 ELSE 0 END) AS TRAN

我正在编写一个SQL Server脚本,根据实际库存,从今天开始重新计算过去365天内特定SKU的库存。在scrip中,我做了很多数据清理操作。最后,从临时表生成输出,如下所示:

SELECT
    DATE,
    SUM(CASE WHEN MOV='IN' THEN 1 ELSE 0 END) AS TRANSACTION_IN, --COUNT TRANSACTIONS IN
    SUM(CASE WHEN MOV='OUT' THEN 1 ELSE 0 END) AS TRANSACTION_OUT, --COUNT TRANSACTIONS OUT
    SUM(CASE WHEN MOV ='IN' THEN QTD ELSE 0 END) AS SUM_IN, --SUM QUANTITY IN
    SUM(CASE WHEN MOV ='OUT' THEN QTD ELSE 0 END) AS SUM_OUT --SUM QUANTITY IN
FROM #MOVIMENTS
GROUP BY DT
ORDER BY DT
下面可以看到SQL的输出示例:

该表显示了按日期分组的交易记录和进出仓库的数量。我的意图是添加一个名为“库存”的列,该列表示所代表的日期的SKU库存水平。因此,我得到的是实际库存水平。所以我需要的是在所有的日期序列中每天重新计算所有的库存水平

在Excel中,这很简单。我可以将实际标高放在最后一行(例如:10),然后扩展计算(图中给出的公式),直到到达顶部。如图所示(E列为公式,G列为输出):

是否有人可以帮助我在SQL Server中实现此结果

在Python中,我发现了一个使用Pandas的方法,但我更愿意在SQL脚本中实现这个计算。

您需要一个连续(或窗口)的总和

基于@EzLo的思想,我找到了解决这个问题的方法

DECLARE @cum_sum float -- scalar cumulated sum
DECLARE @last_stock float = 10 -- current stock level

-- get the last value of the cumulated sum 
SELECT TOP 1 @cum_sum = SUM(SUM_IN + SUM_OUT) OVER (ORDER BY Date ASC) FROM t ORDER BY DATE DESC

-- final select
SELECT 
  *,
  RunningSum = SUM(SUM_IN + SUM_OUT) OVER (ORDER BY Date ASC) - (@cum_sum - @last_stock)
FROM t

有更简单的方法吗?

提示:查看SUM()OVER(),您好,我可以看到此指令可以将累积和作为“RunningSum”给出。那还不是我想要的。我已经有了最后的库存水平。使用它,我的意图是计算前几天的水平(考虑到(P.SUM\u IN+P.SUM\u OUT))。@ArnoldSouza然后使用
按P.Date DESC排序
,并将您的最终库存添加到SUM(),如10+
SUM()OVER()
该指令会导致从较早日期到最新日期的累计总和。我已经有了最新的日期(即@last_stock int=10),我想运行一个SQL来获得考虑SUM_IN和SUM_OUT的其他以前的库存水平
;WITH PartialResults AS
(
    SELECT
        DATE,
        SUM(CASE WHEN MOV='IN' THEN 1 ELSE 0 END) AS TRANSACTION_IN, --COUNT TRANSACTIONS IN
        SUM(CASE WHEN MOV='OUT' THEN 1 ELSE 0 END) AS TRANSACTION_OUT, --COUNT TRANSACTIONS OUT
        SUM(CASE WHEN MOV ='IN' THEN QTD ELSE 0 END) AS SUM_IN, --SUM QUANTITY IN
        SUM(CASE WHEN MOV ='OUT' THEN QTD ELSE 0 END) AS SUM_OUT --SUM QUANTITY IN
    FROM #MOVIMENTS
    GROUP BY DT
)
SELECT
    P.*,
    RunningSum = SUM(P.SUM_IN + P.SUM_OUT) OVER (ORDER BY P.Date ASC)
FROM
    PartialResults AS P
DECLARE @cum_sum float -- scalar cumulated sum
DECLARE @last_stock float = 10 -- current stock level

-- get the last value of the cumulated sum 
SELECT TOP 1 @cum_sum = SUM(SUM_IN + SUM_OUT) OVER (ORDER BY Date ASC) FROM t ORDER BY DATE DESC

-- final select
SELECT 
  *,
  RunningSum = SUM(SUM_IN + SUM_OUT) OVER (ORDER BY Date ASC) - (@cum_sum - @last_stock)
FROM t