SQL Server 2008, Zugewiesener Bestand zur Menge der Verkaufsbestellung basierend auf der Auftragsart und dem Auftragsdatum

Ich habe vom FIFO den Lagerbestand dem Verkaufsauftrag zugeordnet, basierend auf der folgenden Auftragsart:

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'),
('D2','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

das Ergebnis

dealercode  partcode    Stock   orderqty    Allocated   ordertype
D3  C   9   11  9   HotLine
D1  A   20  19  19  Urgent
D2  B   15  10  10  Normal
D1  D   30  20  20  Normal
D2  D   10  40  10  Normal
D2  E   0   12  0   Normal

Ich würde es vorziehen, gleich zugeteilt. Ex. Artikelcode D (Lager = 30, Bestellmenge 20 & 40 => Zugeordnet (15,15). Bitte helfen Sie mir.

AKTUALISIEREN Die aktualisierte Logik wird jedem Teil einmalig mit Menge = 1 zugewiesen und durchläuft alle Teile, bis stock = 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','A',10,'Normal'),
('D3','A',11,'HotLine'),
('D1','A',20,'Normal'),
('D2','A',12,'Normal'),
('D1','A',40,'Normal');

DECLARE @tblStock TABLE
    (PartCode NVARCHAR(50),
     StockQty INT)
INSERT  INTO @tblStock
        ( PartCode,
          StockQty)
VALUES  ('A',100);

;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

Ergebnis der FIFO-Zuordnung nach Bestellmenge:

dealercode  partcode    Stock   orderqty    Allocated   ordertype
D3  A   100 11  11  HotLine
D1  A   89  19  19  Urgent
D1  A   70  20  20  Normal
D1  A   50  40  40  Normal
D2  A   10  12  10  Normal
D2  A   0   10  0   Normal

Ich bevorzuge es, FIFOs mit orderty = 1 zuzuweisen, damit das Ergebnis genauer ist:

dealercode  partcode    Stock   orderqty    Allocated   ordertype
D3  A   100 11  11  HotLine
D1  A   89  19  19  Urgent
D1  A   70  20  20  Normal
D1  A   50  40  28  Normal
D2  A   22  12  12  Normal
D2  A   10  10  10  Normal

in Excel, zugewiesen durch Menge = 1 für alle Bestellungen:

Antworten auf die Frage(4)

Ihre Antwort auf die Frage