累计持股
Cumulative Stock Holding
我正在尝试根据以下数据创建库存。
Input and Desired Output
我尝试使用创建交易列(开始 + UK Open PO - UK Sales)。
然后使用下面的 SQL 代码创建股票。
Sum OVER ( TRANSACTIONS)
[ <PARTITION BY No_ ]
[ <ORDER BY Date ]
但问题是我不希望持有的股票变成负值。我希望它显示 0,因此当 2019 年 4 月 14 日有 960 个单位时,库存量为 921 个单位 (960-39) 而不是 116 个单位。
以黄色突出显示的列是我想要的输出。我需要超过 5k 个 SKU(第 _ 列)
如有任何帮助,我们将不胜感激。
No_ Date UK-Open PO UK-Sales Starting Stock Trans. Cumul Stock Stock Level
111111 22/03/2019 47 100 53 53 53
111111 24/03/2019 330 -330 -277 0
111111 31/03/2019 443 -443 -720 0
111111 07/04/2019 85 -85 -805 0
111111 14/04/2019 960 39 921 116 921
111111 21/04/2019 960 112 848 964 1769
111111 28/04/2019 100 -100 864 1669
111111 05/05/2019 504 -504 360 1165
111111 12/05/2019 606 -606 -246 559
111111 19/05/2019 118 -118 -364 441
111111 26/05/2019 400 -400 -764 41
111111 02/06/2019 674 -674 -1438 0
111111 09/06/2019 338 -338 -1776 0
111111 16/06/2019 206 -206 -1982 0
111111 23/06/2019 115 -115 -2097 0
111111 30/06/2019 500 66 434 -1663 434
111111 07/07/2019 33 -33 -1696 401
像您一样抑制负数需要记住之前所有行发生的情况。 las,这不能使用 window 函数来完成。
备选方案是递归 CTE:
with t as (
select no_, date, starting_stock, trans,
row_number() over (partition by no_ order by date) as seqnum
from <table>
),
cte as (
select no_, date, trans, seqnum,
starting_stock as stock_level
from t
where seqnum = 1
union all
select t.no_, t.date, t.trans, t.seqnum,
(case when cte.starting_stock + t.trans < 0 then 0
else cte.starting_stock + t.trans
end) as stock_level
from cte join
t
on t.seqnum = cte.seqnum + 1 and
t.no_ = cte.no_
)
select *
from cte
option (maxrecursion 0);
如果递归的行数超过 100,则只需要 option
。
我正在尝试根据以下数据创建库存。
Input and Desired Output 我尝试使用创建交易列(开始 + UK Open PO - UK Sales)。
然后使用下面的 SQL 代码创建股票。
Sum OVER ( TRANSACTIONS)
[ <PARTITION BY No_ ]
[ <ORDER BY Date ]
但问题是我不希望持有的股票变成负值。我希望它显示 0,因此当 2019 年 4 月 14 日有 960 个单位时,库存量为 921 个单位 (960-39) 而不是 116 个单位。
以黄色突出显示的列是我想要的输出。我需要超过 5k 个 SKU(第 _ 列)
如有任何帮助,我们将不胜感激。
No_ Date UK-Open PO UK-Sales Starting Stock Trans. Cumul Stock Stock Level
111111 22/03/2019 47 100 53 53 53
111111 24/03/2019 330 -330 -277 0
111111 31/03/2019 443 -443 -720 0
111111 07/04/2019 85 -85 -805 0
111111 14/04/2019 960 39 921 116 921
111111 21/04/2019 960 112 848 964 1769
111111 28/04/2019 100 -100 864 1669
111111 05/05/2019 504 -504 360 1165
111111 12/05/2019 606 -606 -246 559
111111 19/05/2019 118 -118 -364 441
111111 26/05/2019 400 -400 -764 41
111111 02/06/2019 674 -674 -1438 0
111111 09/06/2019 338 -338 -1776 0
111111 16/06/2019 206 -206 -1982 0
111111 23/06/2019 115 -115 -2097 0
111111 30/06/2019 500 66 434 -1663 434
111111 07/07/2019 33 -33 -1696 401
像您一样抑制负数需要记住之前所有行发生的情况。 las,这不能使用 window 函数来完成。
备选方案是递归 CTE:
with t as (
select no_, date, starting_stock, trans,
row_number() over (partition by no_ order by date) as seqnum
from <table>
),
cte as (
select no_, date, trans, seqnum,
starting_stock as stock_level
from t
where seqnum = 1
union all
select t.no_, t.date, t.trans, t.seqnum,
(case when cte.starting_stock + t.trans < 0 then 0
else cte.starting_stock + t.trans
end) as stock_level
from cte join
t
on t.seqnum = cte.seqnum + 1 and
t.no_ = cte.no_
)
select *
from cte
option (maxrecursion 0);
如果递归的行数超过 100,则只需要 option
。