【问题标题】:pick enough items from several locations without doing rbar从多个位置挑选足够的物品而不做 rbar
【发布时间】:2013-12-20 11:26:08
【问题描述】:

我有一个仓库,每个项目编号可以在多个位置。 我有一个可以选择的首选订单。

ITEM   LOC   IN_STOCK
item_1 loc_1 3
item_1 loc_2 3
item_1 loc_3 2
item_2 loc_1 4

首选顺序是位置名称的函数,为了简单起见,我们就说它是order by loc asc

我有一个订单

item_1 4
item 2 2

我想要一个选择列表进入第三个表。

item_1 loc_1 3
item_1 loc_2 1
item_2 loc_1 2

如果我只是进行连接,我会得到三行 item_1

我想在单个 sql 语句中完成,而不是 RBAR,Row By Agonizing Row 循环。

我正在使用 Mssql 2008

【问题讨论】:

  • 您在哪里指定拣货的首选顺序?
  • 这不是你想用存储过程做的事情吗?我的意思是检查第一个库存,然后将其添加到第三个表中。
  • M.Ali 喜欢先从loc_1中取4 item_1,然后触发器看到有库存-1,加1,在另一个位置搜索剩下的1? RBAR 似乎更易于管理:-)

标签: sql tsql rbar


【解决方案1】:

请尝试使用 CTE:

;with T as(
  select *,ROW_NUMBER() over(partition by item order by in_stock, LOC desc) RNum
  From warehouse)
select 
    x.Item,
    x.Loc,
    (case when SM-ItemNum<=in_stock then SM-ItemNum else in_stock end) as in_stock
From(
    select *,(select SUM(b.In_stock) from T b where b.item=a.item and b.RNum<=a.RNum) SM
    from T a
)x inner join orders c on x.item=c.item
where SM-ItemNum>0

在这里查看解决方案SQL Fiddle Demo

【讨论】:

  • @PeterRing 请说明原因。
  • 对不起,我昨天有点累。试试看:创建表 Orders(ITEM nvarchar(100), ItemNum int);插入订单值 ('item_1',7), ('item_2',2);你会发现问题。
  • 我还发现它不起作用。 sqlfiddle.com/#!3/43ce7/1 减少 ('item_1','loc_1',1),现在即使订购了 4 个,也只能得到 2 个 item_1。不知道它应该如何工作,以及为什么不这样做
猜你喜欢
  • 2019-09-29
  • 2016-02-08
  • 2018-10-15
  • 1970-01-01
  • 2021-09-10
  • 2020-04-30
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多