3

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

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

4

1 回答 1

0

请尝试使用 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

于 2013-12-20T12:55:37.240 回答