Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008中基于订单数量的已分配库存数量_Sql Server - Fatal编程技术网

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