Tôi không có SQL Server để giao và SQLFiddle gần đây không chơi tốt với tôi, vì vậy điều này chưa được kiểm tra, nhưng logic sẽ hoạt động ...
WITH
stock_changes
AS
(
SELECT Supplier, Destination, Req_Time, Prd_Code, Prd_Description, -Qty AS Qty FROM orders
UNION ALL
SELECT Supplier, NULL, '00:00', Prd_Code, Prd_Desc, Stock FROM stock
),
stock_post_order
AS
(
SELECT
*,
SUM(Qty) OVER (PARTITION BY Supplier, Prd_Code
ORDER BY Req_Time
ROWS UNBOUNDED PRECEDING
)
AS new_qty
FROM
stock_changes
)
SELECT
*,
CASE WHEN new_qty > qty THEN new_qty ELSE qty END AS order_shortfall
FROM
stock_post_order
WHERE
new_qty < 0
Đầu tiên hãy đảo ngược số lượng đặt hàng của bạn thành số âm, vì vậy chúng là số lượng mà các mức trong kho sẽ thay đổi.
Tiếp theo, kết hợp các mức cổ phiếu của bạn với các đơn đặt hàng, với thời gian bắt buộc là 0 (để làm cho nó giống như một đơn đặt hàng giao hàng hơn là nhận hàng và đến trước tất cả các đơn đặt hàng khác của bạn) .
Tiếp theo, tính xem tổng số lượng sản phẩm còn lại sau khi đặt hàng là bao nhiêu; bằng cách cộng tất cả các hàng trước đó (theo thứ tự thời gian) cho sản phẩm đó. (Tặng Stock - Order1 - Order2, etc, etc
)
Sau đó, chọn các hàng có mức cổ phiếu mới đã âm.