PSI(생산, 수요, 재고) 계산 쿼리 0 1 2,855

by 구름나그네 [SQL Query] 재고 PSI 안전재고 QUERY SQL [2021.08.09 12:58:12]


안전재고를 감안한 생산수량을 계산하는 쿼리를 만들 수 있을까요?

(기말재고는 최소한 안전재고를 보장하는 생산필요량이 계산돠어야 함)

※ MS-SQL 2014 버전 기준에 맞는 1QUERY를 구현하고자 합니다.

TABLE ITEM_INV      
품목코드 기초재고 안전재고      
PA010 50,000 30,000      
PA020 65,000 34,000      
           
TABLE SALE_SUPP      
품목코드 년-주차 판매수요      
PA010 2021-1 20,000      
PA010 2021-2 15,000      
PA010 2021-3 25,000      
PA010 2021-4 0      
PA010 2021-5 55,000      
PA020 2021-1 10,000      
PA020 2021-2 53,000      
PA020 2021-3 0      
PA020 2021-4 35,000      
PA020 2021-5 15,000      
           
결과          
품목 년-주차 기초재고 판매수요량 생산필요량 기말재고
PA010 2021-1 50,000 20,000 0 30,000
PA010 2021-2 30,000 15,000 15,000 30,000
PA010 2021-3 30,000 25,000 25,000 30,000
PA010 2021-4 30,000 0 0 30,000
PA010 2021-5 30,000 55,000 55,000 30,000
PA010 2021-1 65,000 10,000 0 55,000
PA010 2021-2 55,000 53,000 32,000 34,000
PA010 2021-3 34,000 0 0 34,000
PA010 2021-4 34,000 35,000 35,000 34,000
PA010 2021-5 34,000 15,000 15,000 34,000

 감사합니다,

by 마농 [2021.08.09 14:25:36]

년_주차의 표시가 주차 부분이 1자리 인데?
2자리 주차와 함께 표시되면 정렬하기가 어려워지는데요.
2021-01 처럼 고정 자리수로 표시되면 좋은데요.

WITH item_inv(품목코드, 기초재고, 안전재고) AS
(
          SELECT 'PA010', 50000, 30000
UNION ALL SELECT 'PA020', 65000, 34000
)
, sale_supp(품목코드, 년_주차, 판매수요) AS
(
          SELECT 'PA010', '2021-1', 20000
UNION ALL SELECT 'PA010', '2021-2', 15000
UNION ALL SELECT 'PA010', '2021-3', 25000
UNION ALL SELECT 'PA010', '2021-4',     0
UNION ALL SELECT 'PA010', '2021-5', 55000
UNION ALL SELECT 'PA020', '2021-1', 10000
UNION ALL SELECT 'PA020', '2021-2', 53000
UNION ALL SELECT 'PA020', '2021-3',     0
UNION ALL SELECT 'PA020', '2021-4', 35000
UNION ALL SELECT 'PA020', '2021-5', 15000
)
, item_tmp AS
(
SELECT a.품목코드
     , b.년_주차
     , a.안전재고
     , a.기초재고
     , b.판매수요
     , CASE WHEN a.안전재고 > (a.기초재고 - b.판매수요)
            THEN a.안전재고 - (a.기초재고 - b.판매수요)
            ELSE 0
             END 생산필요
     , CASE WHEN a.안전재고 > (a.기초재고 - b.판매수요)
            THEN a.안전재고
            ELSE (a.기초재고 - b.판매수요)
             END 기말재고 
  FROM item_inv a
 INNER JOIN sale_supp b
    ON a.품목코드 = b.품목코드
 WHERE b.년_주차 = '2021-1'
 UNION ALL
SELECT a.품목코드
     , b.년_주차
     , a.안전재고
     , a.기말재고  기초재고
     , b.판매수요
     , CASE WHEN a.안전재고 > (a.기말재고 - b.판매수요)
            THEN a.안전재고 - (a.기말재고 - b.판매수요)
            ELSE 0
             END 생산필요
     , CASE WHEN a.안전재고 > (a.기말재고 - b.판매수요)
            THEN a.안전재고
            ELSE (a.기말재고 - b.판매수요)
             END 기말재고 
  FROM item_tmp a
 INNER JOIN sale_supp b
    ON a.품목코드 = b.품목코드
 WHERE b.년_주차 = SUBSTRING(a.년_주차, 1, 4) + '-' + CAST(SUBSTRING(a.년_주차, 6, 2) + 1 AS VARCHAR)
)
SELECT *
  FROM item_tmp
 ORDER BY 품목코드
     , SUBSTRING(년_주차, 1, 4)
     , SUBSTRING(년_주차, 6, 2) + 0
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입