2016-07-11 4 views
0

저는 고급 기술이없는 기본 개발자입니다. 나는 php/mysql에서 주문 처리 시스템을 가지고 있으며 SQL의 우선 순위에 따라 부족액을 계산하려고한다. 현재 나는이 PHP 배열을 사용하지만 데이터베이스 자체에서이를 달성하고 싶습니다. 여기 자체 참조 SQL 쿼리의 우선 순위 기반 주문 부족

내가

enter image description here

가있는 쿼리입니다 그리고 이것은 내가

enter image description here

감사를 달성하고자하는 것입니다.

+0

SQLfiddle이 있습니까? – Strawberry

+0

그리고 SQL의 행이 정렬되지 않은 세트를 나타내는 경우 우선 순위를 어떻게 설정합니까? – Strawberry

+0

우선 순위가 첫 주문에서 처음 주문입니까? –

답변

0

내부 쿼리는 제품 및 주문 ID별로 주문하고 제품 변경시 누적 합계를 계산합니다.

/* 
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

Subquery를 사용한 쿼리 만 Subquery는 외부 쿼리가 원하는 내부 쿼리의 비트를 표시하는 모든 작업을 수행합니다. from 문에서 괄호로 묶인 select는 하위 쿼리에서 사용되는 일부 변수를 초기화합니다. 자체적으로 하위 쿼리를 실행하여 수행중인 것을 확인할 수 있습니다. 핵심은 '@RN 변수를 사용하여 제품을 주문하는 것입니다. –