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