首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL在零时重置运行和

Oracle SQL在零时重置运行和
EN

Stack Overflow用户
提问于 2016-09-24 07:55:38
回答 2查看 893关注 0票数 1

我想这是可能的,但是大量的研究和无数的时间都没有得到回报。

我在从仓库里卖产品。我知道我什么时候会收到货物,我有每日销售预测(在数量上)。我需要计算期末存货。这基本上是库存预测的总结性。

问题是,当我的产品用完后,第二天我就不会有负库存了,就像运行中的金额所显示的那样。在我收到另一批货之前,库存将为零。在预测中,它可以多次降到零(比下面的例子要多得多)。

数据集的可视化(所需的黄色列)

破解案件的SQL Fiddle

下面是我的实际查询:

代码语言:javascript
复制
SELECT FORECAST_DATE, DAYS_OUT, INBOUND_INVENTORY, FORECAST,
       ENDING_INVENTORY AS DESIRED_RESULT,
       SUM(INBOUND_INVENTORY) OVER (PARTITION BY NULL ORDER BY DAYS_OUT) -
           SUM(FORECAST) OVER (PARTITION BY NULL ORDER BY DAYS_OUT) AS ENDING_INVENTORY
FROM MRP

日期:预测日期(由今日开始) 天数:从今天到预测日期之间的天数。 入站库存:产品进货(为今天,产品在此) 预测:我的预计销售量 期末库存:入站库存-预测+如果昨天的期末库存<=为0,那么昨天的期末库存为0。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-24 13:12:01

下面是使用MODEL子句的解决方案(在Oracle 10中引入)。

我没有包括forecast_date列-- days_out就足够了。

代码语言:javascript
复制
with
     inputs ( days_out, inbound_inventory, forecast ) as (
       select  0,  24,   0 from dual union all
       select  1,   0, 124 from dual union all
       select  2,   0, 154 from dual union all
       select  3,   0, 316 from dual union all
       select  4, 780, 119 from dual union all
       select  5, 780, 148 from dual union all
       select  6, 780, 123 from dual union all
       select  7,   0, 168 from dual union all
       select  8,   0, 323 from dual union all
       select  9,   0, 184 from dual union all
       select 10,   0, 331 from dual union all
       select 11,   0, 149 from dual union all
       select 12,   0, 431 from dual union all
       select 13,   0, 153 from dual union all
       select 14,   0, 183 from dual union all
       select 15,   0, 169 from dual union all
       select 16,   0, 169 from dual union all
       select 17, 780, 331 from dual
     )
select days_out, inbound_inventory, forecast, ending_inventory
from   inputs
model
  dimension by ( days_out )
  measures     ( inbound_inventory, forecast, 0 ending_inventory )
  rules update 
  iterate(1000000) until (previous(ending_inventory[iteration_number + 1]) is null)
  (
    ending_inventory[iteration_number] = 
           greatest ( 0, inbound_inventory[cv()] - forecast[cv()] 
                           + nvl(ending_inventory[cv() - 1], 0 )
                    )
  )
;

输出

代码语言:javascript
复制
  DAYS_OUT INBOUND_INVENTORY   FORECAST ENDING_INVENTORY
---------- ----------------- ---------- ----------------
         0                24          0               24
         1                 0        124                0
         2                 0        154                0
         3                 0        316                0
         4               780        119              661
         5               780        148             1293
         6               780        123             1950
         7                 0        168             1782
         8                 0        323             1459
         9                 0        184             1275
        10                 0        331              944
        11                 0        149              795
        12                 0        431              364
        13                 0        153              211
        14                 0        183               28
        15                 0        169                0
        16                 0        169                0
        17               780        331              449

18 rows selected.
票数 2
EN

Stack Overflow用户

发布于 2016-09-24 09:04:22

这是对的吗?这是一种叫做递归公共表表达式的东西。

代码语言:javascript
复制
WITH
cte_mrp as
(
    Select row_number() over (partition by null order by forecast_date) as line, mrp.*
    From mrp
),
RCTE (line, forecast_date, days_out, inbound_inventory, forecast, /*iteration, anchor,*/ ending_inventory) as
(
    Select line, forecast_date, days_out, inbound_inventory, forecast, /*0 iteration, 'anchor' anchor,*/
        CASE WHEN inbound_inventory-forecast < 0 THEN 0 ELSE inbound_inventory-forecast END ending_inventory
    From cte_mrp
    Where line = 1

    union all

    Select m.line, m.forecast_date, m.days_out, m.inbound_inventory, m.forecast, /*r.iteration + 1, 'rcte' anchor,*/
        CASE WHEN r.ending_inventory+m.inbound_inventory - m.forecast < 0 THEN 0 ELSE r.ending_inventory+m.inbound_inventory - m.forecast END ending_inventory
    From cte_mrp m
    Inner join rcte r on (r.line = (m.line-1))
)

Select * From RCTE;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39673962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档