Saya tidak memiliki SQL Server dan SQLFiddle tidak cocok dengan saya akhir-akhir ini, jadi ini belum teruji, tetapi logikanya akan bekerja...
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
Pertama-tama, balikkan jumlah pesanan Anda menjadi negatif, sehingga jumlah tersebut adalah jumlah yang akan diubah oleh tingkat stok.
Selanjutnya, gabungkan tingkat stok Anda ke pesanan, dengan waktu yang diperlukan 0 (untuk membuatnya sedikit seperti pesanan yang mengirimkan stok daripada mengambil stok, dan datang sebelum semua pesanan Anda yang lain) .
Selanjutnya, cari tahu berapa jumlah sisa produk setelah pemesanan; dengan menjumlahkan semua baris sebelumnya (dalam urutan waktu) untuk produk itu. (Memberikan Stock - Order1 - Order2, etc, etc
)
Kemudian pilih baris di mana tingkat stok baru menjadi negatif.