累计持股

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