需要减去直到值达到限制/预测库存何时用完
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;
这将在商品数量达到零时计算售罄。如果您确实需要缩短某个项目,则需要更改条件,以便第二个是<
而不是<=
。
【讨论】:
以上是关于需要减去直到值达到限制/预测库存何时用完的主要内容,如果未能解决你的问题,请参考以下文章
将变量传递给函数\使用该变量返回一个新值\重复直到值达到 0
使用 Contains() 时达到 2100 参数限制 (SQL Server)
如何使用 .AfterUpdate 数据宏更新同一个表中的多条记录,而不会出现“数据宏资源限制已达到”错误。