【问题标题】:Analyzing Inflow and outflow of parts分析零件的流入和流出
【发布时间】:2019-04-12 12:02:39
【问题描述】:

我们需要分析一个零件的消耗。我拥有的数据来自我们的 ERP 系统。这个想法是在未来库存过多的地方找到“漏洞”。

Part_number Sign Count Date
4711        B    100   12.04.2019
4711        -    2     16.04.2019
4711        -    1     18.04.2019
4711        -    3     01.05.2019
4711        -    5     14.05.2019
4711        -    1     18.05.2019
4711        +    25    23.05.2019
4711        -    7     24.05.2019
4711        -    1     01.06.2019
4711        -    1     14.06.2019
4711        -    6     15.06.2019
4711        +    15    23.07.2019
4711        -    7     24.07.2019
4711        -    3     01.08.2019
4711        -    25    14.08.2019
4711        -    6     15.08.2019
4712        B    10    12.04.2019
4712        -    2     13.04.2019
4712        -    3     14.04.2019
4713        …    …     …

栏目说明:

  • Part_number => 自我解释我猜
  • 标志
    • “B”当前库存,
    • “-”用于构建订单的部分,
    • “+”新零件订购和计划到货日期
  • 计数 => 数量
  • 日期 => 未来的计划日期

我的想法是将数据分成几部分。每当库存发生积极变化时,一个部分就会开始,例如到达的订单,并以库存的下一个积极变化结束。 第一部分和最后一部分是一个例外。第一部分以今天的日期开始,以下一个积极的变化结束。最后一部分从最后一个积极的变化开始,到最后一个数据行结束。

我希望基于上述数据的部分表格看起来像这样。

Part_number Section Date_start  Date_end
4711        1       12.04.2019  23.05.2019
4711        2       23.05.2019  23.07.2019
4711        3       23.07.2019  15.08.2019
4712        1       12.04.2019  14.04.2019

要找到“漏洞”,应将计数列相加,结果如下表

Part_number Section Date_start  Date_end   Sum
4711        1       12.04.2019  23.05.2019 88   <= 100-2-1-3-5-1
4711        2       23.05.2019  23.07.2019 98   <= 88+25-7-1-1-6
4711        3       23.07.2019  15.08.2019 72   <= 98+15-7-3-25-6
4712        1       12.04.2019  14.04.2019 5    <= 10-2-3

我们的数据库服务器是 Microsoft Sql Server 2016。

目前我正在使用游标构造来处理数据并得到我想要的。正如您可能想象的那样,这可能不是最好的方法。我想改进这个查询,并期待我能得到任何提示。

谢谢!

【问题讨论】:

    标签: sql sql-server tsql sql-server-2016


    【解决方案1】:

    如果我理解正确,您可以使用聚合和窗口函数。关键是定义部分,这似乎是每一行的B+ 的累积计数:

    select part_number, section,
           min(date), max(date),
           sum(case when sign = '-' then -count else count end) as section_count,
           sum(sum(case when sign = '-' then -count else count end)) over (partition by part_number order by section) as sum
    from (select t.*,
                 sum(case when sign in ('B', '+') then 1 else 0 end) over (partition by part_number order by date) as section
          from t
         ) t
    group by part_number, section;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多