Re: Help in writing an SQL query to allocate parts to purchase orders -
10-01-2011
, 12:26 AM
An example:
------------------------------ Commands Entered
------------------------------
WITH
stock(part_no , batch_no , quantity) AS (
VALUES
( 'S01' , 'B1' , 100 )
, ( 'S01' , 'B2' , 50 )
, ( 'S01' , 'B3' , 75 )
)
, purchase_order(order_no , part_no , quantity) AS (
VALUES
( 'PO1' , 'S01' , 20 )
, ( 'PO2' , 'S01' , 100 )
, ( 'PO3' , 'S01' , 100 )
)
SELECT p.order_no
, s.batch_no
, MIN( p.sum_order - s.lag_stock
, s.sum_stock - p.lag_order
) AS quantity
FROM (SELECT p.*
, SUM( quantity )
OVER( PARTITION BY part_no
ORDER BY order_no ) sum_order
, LAG( SUM(quantity)
OVER( PARTITION BY part_no
ORDER BY order_no )
, 1 , 0
)
OVER( PARTITION BY part_no
ORDER BY order_no ) lag_order
FROM purchase_order p
) p
LEFT OUTER JOIN
(SELECT s.*
, SUM(quantity)
OVER( PARTITION BY part_no
ORDER BY batch_no ) sum_stock
, LAG( SUM(quantity)
OVER( PARTITION BY part_no
ORDER BY batch_no )
, 1 , 0
)
OVER( PARTITION BY part_no
ORDER BY batch_no ) lag_stock
FROM stock s
) s
ON s.part_no = p.part_no
AND s.sum_stock > p.lag_order
AND s.lag_stock < p.sum_order
ORDER BY
p.order_no
, s.batch_no
;
------------------------------------------------------------------------------
ORDER_NO BATCH_NO QUANTITY
-------- -------- -----------
PO1 B1 20
PO2 B1 80
PO2 B2 20
PO3 B2 30
PO3 B3 70
5 record(s) selected. |