2016-07-11 9 views
0

Я базовый разработчик, не имеющий передовых навыков. У меня есть система обработки заказов в php/mysql и вы хотите рассчитать дефицит на основе приоритета в SQL. В настоящее время я использую для этого массивы php, но я хочу достичь этого в самой базе данных.Недостаток порядка на основе приоритета в запросе sql-запроса

Вот запросы у меня есть

enter image description here

И это то, что я хочу, чтобы достичь

enter image description here

Спасибо.

+0

Есть ли SQL-скрипт? – Strawberry

+0

И, учитывая, что строки в SQL представляют собой неупорядоченные множества, как вы устанавливаете приоритет? – Strawberry

+0

Похоже, что приоритет - первый заказ в первом порядке? –

ответ

0

Внутренние запросы заказываются по продукту и заказу и рассчитываются текущий общий сброс при смене продукта.

/* 
drop table orders; 

create table orders (orderid varchar(6),productid varchar(10),reqqty int); 

create table stock (productid varchar(6), stock int); 

truncate table orders; 
insert into orders values 
('OR250','A45',100),('OR250','A55',200),('OR250','A65',400), 
('OR260','A45',150),('OR260','A55',25), 
('OR270','A55',100),('OR270','A65',50),('OR270','B15',500) 
; 

TRUNCATE TABLE STOCK; 
INSERT INTO STOCK VALUES 
('A45',200),('A55',250),('A65',180),('A75',300),('A85',400),('A95',780),('B15',150),('B25',225); 
*/ 

SELECT T.ORDERID,T.PRODUCTID,T.REQQTY,T.SHORTAGE,T.STOCKREMAINING AS STOCK 
FROM 
(
SELECT @RN:=IF (O.PRODUCTID <> @PRV,1,@RN+1) RN, 
      O.ORDERID,O.PRODUCTID,O.REQQTY 
      ,S.PRODUCTID AS SPRODUCTID,S.STOCK 
      ,@PRV:=O.PRODUCTID PREVPROD 
      ,@RT:=IF(@RT=0 OR @RN = 1,S.STOCK-O.REQQTY,@RT - O.REQQTY) RT 
      ,CASE WHEN @RT < 0 THEN @RT * -1 ELSE 0 END AS SHORTAGE 
      ,CASE WHEN @RT >= 0 THEN @RT ELSE 0 END AS STOCKREMAINING 
FROM (SELECT @RN:=0) RN,(SELECT @PRV:='') PRV,(SELECT @RT:=0) RT,ORDERS O 
JOIN STOCK S ON S.PRODUCTID = O.PRODUCTID 
) T 
ORDER BY T.ORDERID,T.PRODUCTID 
+0

Это замечательно :) Большое спасибо. Но это слишком продвинуто для меня. Не могли бы вы рассказать мне, что это такое, что я знаю только базовые запросы и подзапросы. Является ли это хранимой процедурой или динамическим запросом? Поэтому я могу это узнать. –

+0

Его просто запрос с подзапросом. Подзапрос делает всю работу внешним запросом, просто представляет биты из внутреннего запроса, который вы хотите. Выбранные в скобках в инструкции from инициализируют некоторые переменные, которые используются в подзапросе. Вы можете запустить подзапрос самостоятельно, чтобы убедиться, что это делается - ключевым является заказ продукта с использованием переменной @RN. –