Sql server SQL Server 2008中基于订单数量的已分配库存数量
我在下面查询分配的库存数量,以根据订单类型匹配订单数量。问题是库存数量没有更新Sql server SQL Server 2008中基于订单数量的已分配库存数量,sql-server,Sql Server,我在下面查询分配的库存数量,以根据订单类型匹配订单数量。问题是库存数量没有更新 DECLARE @tblOrder TABLE (DealerCode NVARCHAR(50), PartCode NVARCHAR(50), OrderQty INT, OrderType NVARCHAR(50) ) INSERT INTO @tblOrder ( DealerCode, PartCode,
DECLARE @tblOrder TABLE
(DealerCode NVARCHAR(50),
PartCode NVARCHAR(50),
OrderQty INT,
OrderType NVARCHAR(50)
)
INSERT INTO @tblOrder
( DealerCode,
PartCode,
OrderQty,
OrderType )
VALUES ('D1','A',19,'Urgent'),
('D2','B',10,'Normal'),
('D3','C',11,'HotLine'),
('D1','D',20,'Normal'),
('D2','E',12,'Normal'),
('D1','D',40,'Normal');
DECLARE @tblStock TABLE
(PartCode NVARCHAR(50),
StockQty INT)
INSERT INTO @tblStock
( PartCode,
StockQty)
VALUES ('A',20),
('B',15),
('C',9),
('D',30),
('E',0)
;WITH ordertemp AS (
select ord.dealercode,
ord.partcode,
ord.orderqty,
ord.ordertype,
RANK() OVER (ORDER BY case ord.ordertype when 'HotLine' then 1 when 'Urgent' then 2 else 3 end, ord.partcode, ord.dealercode) 'StockPriority',
sto.stockqty 'InitialStock'
from @tblorder ord
left outer join @tblstock sto
on ord.partcode = sto.partcode )
SELECT
Orders.dealercode,
Orders.partcode,
CASE WHEN Backlog.PriorQty > Orders.InitialStock THEN 0
ELSE Orders.InitialStock - Backlog.PriorQty END 'Stock',
Orders.orderqty,
CASE WHEN Backlog.PriorQty + Orders.OrderQty < Orders.InitialStock THEN Orders.OrderQty
WHEN Backlog.PriorQty > Orders.InitialStock THEN 0
ELSE Orders.InitialStock - Backlog.PriorQty END 'Allocated',
Orders.ordertype
FROM
ordertemp Orders
INNER JOIN
(
SELECT A.stockpriority, A.partcode, ISNULL(SUM(B.orderqty),0) 'PriorQty'
from ordertemp A
LEFT OUTER JOIN ordertemp B
on A.partcode = B.partcode
and A.stockpriority > B.stockpriority
group by A.stockpriority, A.partcode ) Backlog
ON Orders.stockpriority = Backlog.stockpriority
ORDER BY Orders.StockPriority
实际上,零件代码“D”的库存30在分配20后必须保持为10。
有什么想法吗?你得到30只股票的原因是因为你用排名来划分优先级。如果两个订单记录具有相同的库存优先级,则RANK会将相同的编号分配给两个订单记录,这两个订单记录的库存优先级由您的条件ord.ORDERBY case定义,当“热线”时为ord.ORDERBYPE,当“紧急”时为1,当“紧急”时为2,否则为3 end,ord.partcode,ord.dealercode。如果您检查ordertemp的输出,您将看到
dealercode partcode orderqty ordertype StockPriority InitialStock
D3 C 11 HotLine 1 9
D1 A 19 Urgent 2 20
D2 B 10 Normal 3 15
D1 D 20 Normal 4 30
D1 D 40 Normal 4 30
D2 E 12 Normal 6 0
请注意,对于第4行和第5行,partcode D的StockPriority都是4
您可以通过使用行编号而不是秩来修复此问题。您还可以在第_行中添加orderqty,以指定如果较小/较大的订单具有相同的订单类型、零件代码和dealercode,您是否希望它们具有更高的优先级
行号为的查询
他就在上面-当你第一次发布时,我假设每个供应商每个零件/优先级只有一个条目,而不是重复条目:
注意:如果您添加了orderquantity,那么如果每个条目中有两个相同数量的条目,您仍然会遇到问题。谢谢@ughai,还有一个,我想为ordertype Normal平均分配数量吗。例如,库存数量=10,经销商代码订单D1=1,D2=2,D3=4,D4=6,则分配数量应为D1=1,D2=3,D3=3,D4=3您可以像普通零件一样计算每个订单类型下的订单总数和总数量,然后将其用作参考,在所有此类订单之间分配相等的百分比。我可以找到每个订单类型下的零件总数/数量,但是如何平均分配百分比呢?谢谢你的评论:呵呵,不用担心,你终于做到了。你是从这里还是从其他地方捡到的我从这个网站得到的。我更喜欢平均分配股票,你能帮我吗?@Sokea-我刚看到你的新问题。我会回答的
dealercode partcode orderqty ordertype StockPriority InitialStock
D3 C 11 HotLine 1 9
D1 A 19 Urgent 2 20
D2 B 10 Normal 3 15
D1 D 20 Normal 4 30
D1 D 40 Normal 4 30
D2 E 12 Normal 6 0
DECLARE @tblOrder TABLE
(DealerCode NVARCHAR(50),
PartCode NVARCHAR(50),
OrderQty INT,
OrderType NVARCHAR(50)
)
INSERT INTO @tblOrder
( DealerCode,
PartCode,
OrderQty,
OrderType )
VALUES ('D1','A',19,'Urgent'),
('D2','B',10,'Normal'),
('D3','C',11,'HotLine'),
('D1','D',20,'Normal'),
('D2','E',12,'Normal'),
('D1','D',40,'Normal');
DECLARE @tblStock TABLE
(PartCode NVARCHAR(50),
StockQty INT)
INSERT INTO @tblStock
( PartCode,
StockQty)
VALUES ('A',20),
('B',15),
('C',9),
('D',30),
('E',0)
;WITH ordertemp AS (
select ord.dealercode,
ord.partcode,
ord.orderqty,
ord.ordertype,
ROW_NUMBER() OVER (ORDER BY case ord.ordertype when 'HotLine' then 1 when 'Urgent' then 2 else 3 end, ord.partcode, ord.dealercode) 'StockPriority',
sto.stockqty 'InitialStock'
from @tblorder ord
left outer join @tblstock sto
on ord.partcode = sto.partcode )
SELECT
Orders.dealercode,
Orders.partcode,
CASE WHEN Backlog.PriorQty > Orders.InitialStock THEN 0
ELSE Orders.InitialStock - Backlog.PriorQty END 'Stock',
Orders.orderqty,
CASE WHEN Backlog.PriorQty + Orders.OrderQty < Orders.InitialStock THEN Orders.OrderQty
WHEN Backlog.PriorQty > Orders.InitialStock THEN 0
ELSE Orders.InitialStock - Backlog.PriorQty END 'Allocated',
Orders.ordertype
FROM
ordertemp Orders
INNER JOIN
(
SELECT A.stockpriority, A.partcode, ISNULL(SUM(B.orderqty),0) 'PriorQty'
from ordertemp A
LEFT OUTER JOIN ordertemp B
on A.partcode = B.partcode
and A.stockpriority > B.stockpriority
group by A.stockpriority, A.partcode ) Backlog
ON Orders.stockpriority = Backlog.stockpriority
ORDER BY Orders.StockPriority