需要减去直到值达到限制/预测库存何时用完

Posted

技术标签:

【中文标题】需要减去直到值达到限制/预测库存何时用完【英文标题】:Need to subtract until value reaches limit / predict when inventory runs out 【发布时间】:2018-10-17 19:54:08 【问题描述】:

我正在处理具有以下两个表的查询: 表A:

Store       NumItems
1           500
2           1000
3           575 

表 B:

Store   Day             ItemsSold
1       Monday          100
1       Tuesday         200
1       Wednesday       110
1       Thursday        10
1       Friday          1
1       Saturday        140
1       Sunday          90
2       Monday          400
2       Tuesday         150
2       Wednesday       501
2       Thursday        190
2       Friday          600
2       Saturday        180
2       Sunday          21
3       Monday          100
3       Tuesday         1050
3       Wednesday       108
3       Thursday        102
3       Friday          51
3       Saturday        40
3       Sunday          15

我需要能够判断商店何时会用完商品。我可以获得我运行流程的星期几,但我需要循环或以某种方式继续从每个商店和庄园中减去(假设这是在周一运行 - 商店 1 将在周六用完商店 1 上的商品, 2号店周三售完,3号店周二售完)。

提前谢谢大家的帮助!!!

【问题讨论】:

输出应该是什么样的?除了day 之外,是否还有一列可以指定表 B 中的排序? 我们是否应该假设 NumItems 可能大于一周所售商品的价值? @hatchet7 - 是的,NumItems 可以超过 1 周的价值。 【参考方案1】:

你可以试试这个。

编写 CTE 计算每天累积的差异量。然后在查询中获取 Get the maximum negative 。

;WITH CTE AS(
    SELECT * 
    FROM(
        SELECT a.Store,a.NumItems,b.Day, a.NumItems- SUM(b.ItemsSold) 
                                            OVER(PARTITION BY B.Store  
                                                    order by case when b.day='Monday'    then 1
                                                                  when b.day='Tuesday'   then 2
                                                                  when b.day='Wednesday' then 3
                                                                  when b.day='Thursday'  then 4
                                                                  when b.day='Friday'    then 5
                                                                  when b.day='Saturday'  then 6
                                                                  when b.day='Sunday'    then 7
                                                end
                                            ROWS BETWEEN UNBOUNDED PRECEDING  AND CURRENT ROW) diffVal
        FROM A 
        INNER JOIN B ON A.Store = B.Store
    )t
)
SELECT t.Store,t.Day 
FROM CTE t
WHERE exists (SELECT MAX(diffVal) FROM CTE WHERE diffVal < 0 GROUP BY Store HAVING t.diffVal = MAX(diffVal))

sqlfiddle:http://sqlfiddle.com/#!18/2a472/1

【讨论】:

【参考方案2】:

假设支持sum窗口功能,你可以这样做

select top 1 with ties store,day
from (select a.store,b.day,
      a.numItems-sum(b.itemsSold) over(partition by b.store 
                                       order by case when b.day='Monday' then 1
                                                     when b.day='Tuesday' then 2
                                                     --/*fill remaining values*/...
                                                end
                                      ) as rem
      from tblA a
      join tblB b on a.store=b.store
     ) t 
where rem <= 0
order by row_number() over(partition by store order by rem desc) 

这个想法是从day order 中的项目总数中减去 itemsSold 的运行总数,并获得差异为

【讨论】:

用一周的总数来修改 numItems 是否明智? @Vamsi Prabhala 结果应该是商店编号,Dayruns out。示例 1 星期六【参考方案3】:

你只需要一个累积和:

select b.*
from a join
     (select b.*,
             sum(itemsold) over (partition by store order by date) as running_itemssold
      from b
     ) b
     on a.store = b.store
where a.numitems > b.running_itemssold - itemsold and
      a.numitems <= b.running_itemsold;

这将在商品数量达到零时计算售罄。如果您确实需要缩短某个项目,则需要更改条件,以便第二个是&lt; 而不是&lt;=

【讨论】:

以上是关于需要减去直到值达到限制/预测库存何时用完的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap 保存数据超过 5mb 限制的最佳实践

将变量传递给函数\使用该变量返回一个新值\重复直到值达到 0

使用 Contains() 时达到 2100 参数限制 (SQL Server)

如何使用 .AfterUpdate 数据宏更新同一个表中的多条记录,而不会出现“数据宏资源限制已达到”错误。

js将string类型转为时间类型:日期不需要,只要时分秒,限制每天的10点30分来减去当前的时间。

(Angular)Watchpack错误(观察者):错误:ENOSPC:达到文件观察者数量的系统限制