【问题标题】:Cumulative Stock Holding累计持股
【发布时间】:2020-03-25 09:54:36
【问题描述】:

我正在尝试根据以下数据创建股票。

Input and Desired Output 我尝试使用创建交易列(Starting + UK Open POs - UK Sales)。

然后使用下面的 SQL 代码创建一个股票。

Sum OVER (   TRANSACTIONS)
   [ <PARTITION BY No_ ]  
   [ <ORDER BY Date ]   

但问题是我不希望持有的股票变成负数。我希望它显示为 0,因此当 19 年 4 月 14 日有 960 个单位进入时,库存为 921 个单位 (960-39) 而不是 116 个单位。

以黄色突出显示的列是我想要的输出。我需要超过 5k 个 SKU(第 5 列)

任何帮助将不胜感激。

    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

【问题讨论】:

  • 您能否将示例数据作为文本添加到问题(我们可以使用)而不是图像(我们不能使用)。
  • 感谢您的回复。如果这是一个明显的问题,我很抱歉,但是您如何简单地添加数据表? “粘贴为文本”格式错误。
  • 如果您使用 ssms 更改查询以将结果作为文本返回,然后使用编辑按钮复制并粘贴到问题中,突出显示粘贴的文本并按 ctrl/k(控制 k)meta.stackexchange.com/questions/22186/…
  • 希望对您有所帮助。谢谢

标签: sql sql-server sql-server-2012 cumulative-sum


【解决方案1】:

在执行过程中抑制负数需要记住所有先前行上发生的情况。唉,这不能用窗口函数来完成。

替代方案是递归 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

【讨论】:

  • 这可行,但我得到“在语句完成之前,最大递归 100 已用尽”我试图在查询末尾添加 'OPTION (MAXRECURSION 0),但在关键字选项。
  • 谢谢你,戈登。理想情况下,我需要 104 行,但我将限制为 100。当我添加 'option (maxrecursion 0);'告诉我这是“不正确的语法”......没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多