SQL Сравните часовые общие заказы и удалите текущий запас?

Не уверен, что это можно сделать, используя только sql, но я бы предпочел спросить, добавив еще один шаг к процессу.

так скажем, например, у меня есть набор фиктивных заказов

+----------+-------------+----------+----------+-----------------+-----+ | Supplier | Destination | Req_Time | Prd_Code | Prd_Description | Qty | +----------+-------------+----------+----------+-----------------+-----+ | A | B | 01:00 | 1 | Chair | 100 | | A | B | 01:00 | 2 | Desk | 50 | | A | B | 01:00 | 3 | Phone | 20 | | A | B | 05:00 | 1 | Chair | 200 | | A | B | 05:00 | 2 | Desk | 20 | +----------+-------------+----------+----------+-----------------+-----+ 

И текущий список запасов

 +----------+----------+----------+-------+ | Supplier | Prd_Code | Prd_Desc | Stock | +----------+----------+----------+-------+ | A | 1 | Chair | 150 | | A | 2 | Desk | 40 | | A | 3 | Phone | 100 | +----------+----------+----------+-------+ 

есть способ, которым я могу создать хранимую процедуру (SQL 2008 -Compatible), которая может вычесть то, что у меня есть на складе, и оставить мне то, что мне нужно, так

 +----------+-------------+----------+----------+-----------------+-----+ | Supplier | Destination | Req_Time | Prd_Code | Prd_Description | Qty | +----------+-------------+----------+----------+-----------------+-----+ | A | B | 01:00 | 2 | Desk | 10 | | A | B | 05:00 | 1 | Chair | 150 | | A | B | 05:00 | 2 | Desk | 20 | +----------+-------------+----------+----------+-----------------+-----+ 

Я хотел бы показать вам, что я пытался, но в этом случае я не знаю, с чего начать.

PS Надо благодарить этот сайт для форматирования таблиц для меня очень легко
https://ozh.github.io/ascii-tables/

Познакомит любое понимание и любые примеры еще больше: D

У меня нет SQL Server, и SQLFiddle не очень хорошо играет со мной в последнее время, поэтому это не проверено, но логика должна работать …

 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 

Сначала инвертируйте количество заказов, которое должно быть отрицательным, поэтому они представляют собой сумму, на которую будут изменяться уровни запасов.

Затем объедините свои уровни запасов с заказами с требуемым временем 0 (чтобы сделать его немного похожим на ордер, который поставляет акции, а не делает акцию, и приходите перед всеми вашими другими заказами) .

Затем выясните, какое количество оставшегося количества продукта после заказа; суммируя все предыдущие строки (по времени) для этого произведения. (Предоставление Stock - Order1 - Order2, etc, etc )

Затем выберите строки, в которых новый уровень запасов стал отрицательным.

Я думаю, вам нужно что-то вроде этого:

 SELECT S.Prd_Code ,S.Stock - Ord.OrderedQty AS RemainingStock FROM Stock S INNER JOIN ( SELECT Prd_Code , SUM(Qty) OrderedQty FROM Orders GROUP BY Prd_Code ) Ord