안녕 하세요.
월 매장 전월기말 입고 출고 기말
202306 A 10 100 10 100
202307 A 100 0 50 50
202308 A 50 50 0 100
202309 A 100 10 100 10
With T_INV AS (
Select '202306' YYYYMM, 10 begin_qty, 100 in_qty, out_qty 10 From Dual Union All
Select '202307' YYYYMM, 10 begin_qty, 0 in_qty, out_qty 50 From Dual Union All
Select '202308' YYYYMM, 10 begin_qty, 50 in_qty, out_qty 0 From Dual Union All
Select '202309' YYYYMM, 10 begin_qty, 10 in_qty, out_qty 100 From Dual Union All
)
06월 전월기말 + 입고 - 출고 = 기말로 게산하고, 해당 기말을 다음 달로 이월하여
07월 전월기말 + 입고 - 출고 = 기말을 게한 하려면 어떻게 해야 하나요?
WITH t_inv AS ( SELECT '202306' yyyymm, 'A' cd, 10 begin_qty, 100 in_qty, 10 out_qty FROM dual UNION ALL SELECT '202307', 'A', 10, 0, 50 FROM dual UNION ALL SELECT '202308', 'A', 10, 50, 0 FROM dual UNION ALL SELECT '202309', 'A', 10, 10, 100 FROM dual ) SELECT yyyymm , cd , begin_qty - (in_qty - out_qty) + SUM(in_qty - out_qty) OVER(PARTITION BY cd ORDER BY yyyymm) begin_qty , in_qty , out_qty , begin_qty + SUM(in_qty - out_qty) OVER(PARTITION BY cd ORDER BY yyyymm) end_qty FROM t_inv ;
답변 감사 합니다.
수치가 다른 경우에는
WITH t_inv AS
(
SELECT '202301' yyyymm, 'A' cd, 10 begin_qty, 50 in_qty, 50 out_qty FROM dual UNION ALL
SELECT '202302' yyyymm, 'A' cd, 0 begin_qty, 50 in_qty, 50 out_qty FROM dual UNION ALL
SELECT '202303' yyyymm, 'A' cd, 0 begin_qty, 50 in_qty, 50 out_qty FROM dual UNION ALL
SELECT '202304' yyyymm, 'A' cd, 10 begin_qty, 50 in_qty, 40 out_qty FROM dual UNION ALL
SELECT '202305' yyyymm, 'A' cd, 10 begin_qty, 50 in_qty, 50 out_qty FROM dual UNION ALL
SELECT '202306' yyyymm, 'A' cd, 0 begin_qty, 50 in_qty, 60 out_qty FROM dual
)
SELECT a.*
from( -- 기말 = 전월기말 + 입고 - 출고
SELECT yyyymm
, cd
, begin_qty
- (in_qty - out_qty)
+ SUM(in_qty - out_qty) OVER(PARTITION BY cd ORDER BY yyyymm) begin_qty
, in_qty
, out_qty
, begin_qty
+ SUM(in_qty - out_qty) OVER(PARTITION BY cd ORDER BY yyyymm) end_qty
FROM t_inv
) A
WHERE a.yyyymm BETWEEN '202301' AND '202306' ;
01월의 END(기말)이 02월의 기초(BEGIN)으로 가지 않네요.
시작월 '202301' 의 기초재고 10 + 입고(50) - 출고(50) = 202301월 기말재고 10
다음달 '202302' 의 기초재고 = 전달 202301의 기말재고 , 이 기초재고를 가지고 기말재고 계산 10 + 50 - 50 = 202302월의 기말재고10 이 됩니다.
다음달 '202303' 의 기초재고 = 전달의 기말재고 = 10, 이 달의 기말재고 = 10 + 50 - 50 = 10
이런식으로 전달의 기말재고가 다음달의 기초재고가 되고, 전달의 기말재고가 다음달 기초재고가 되어
기초재고 + 입고 - 출고로 매월 기말재고를 재 계산해야 합니다.
이상한 데이터로 예외적용을 하여 억지로 결과를 뽑을 수도 있갰지만. 추천하고 싶지 않습니다.
데이터 자체가 정상적인 데이터로 정제되어야 합니다.
지금 올려주신 데이터는 말이 안되는 자료입니다.
WITH t_inv AS ( SELECT '202301' yyyymm, 'A' cd, 10 begin_qty, 50 in_qty, 50 out_qty FROM dual UNION ALL SELECT '202302', 'A', 0, 50, 50 FROM dual UNION ALL SELECT '202303', 'A', 0, 50, 50 FROM dual UNION ALL SELECT '202304', 'A', 10, 50, 40 FROM dual UNION ALL SELECT '202305', 'A', 10, 50, 50 FROM dual UNION ALL SELECT '202306', 'A', 0, 50, 60 FROM dual ) SELECT yyyymm , cd , FIRST_VALUE(begin_qty) OVER(PARTITION BY cd ORDER BY yyyymm) + SUM(in_qty - out_qty) OVER(PARTITION BY cd ORDER BY yyyymm) - (in_qty - out_qty) begin_qty , in_qty , out_qty , FIRST_VALUE(begin_qty) OVER(PARTITION BY cd ORDER BY yyyymm) + SUM(in_qty - out_qty) OVER(PARTITION BY cd ORDER BY yyyymm) end_qty FROM t_inv WHERE yyyymm BETWEEN '202301' AND '202306' ;
감사 합니다.
시스템 시작시 시작재고(기초)는 맞고, 입고, 출고는 맞는데, 기말재고 컬럼이 없고
기초재고 컬럼의 데이터는 타 시스템에서 데이터가 들어오는 구조인데, 잘못된 값이 들어 오고 있습니다.
현업은 시작재고는 맞고, 입고 되고 출고 되는 재고는 맞으니까
기말재고를 계산하여 다음달로 이월하여 다음달 기초로 사용해서
재고수불을 볼 수 있는 레포트를 만들어 달라고 하는데, 테이블의 컬럼을 추가 할 수 도 없고,
해당 테이블에 데이터를 업데이트 권한도 없는 입장이라
전월달재고를 을 다음달로 이월하는 쿼리에 대해서 도움을 요청 드렸습니다.
01월 재고가 기초재고는 최초재고가 맞습니다.
그 다음달 들어오는 기초재고는 타 모듈에서 들어오는 틀린 수치라 사용이 불가
즉 2023년01월 기초재고 = 전년도에 재고실사한 재고를 업로드 = 최초재고
입고재고 = WMS에서 정확하고 들어오는 입고수량
출고재고 = WMS에서 정확하게 빠지는 출고수량
02월 기초 = POS에서 트리거에 의해서 들어오는 수량 ( 틀린 데이터가 많음)
시스템이 변경 되면서, 2022년 12월 재고실사를 해서 2023년 01월에 기초재고에 업로드 해 놓고,
그 다음달 02월 부터는 타 모듈에서 트리거에 의해서 시작재고에 데이터가 들어오는데, 잘못된 값들이 많아서
2023년 01월 부터 기말재고를 계산하여 다음달로 이월하여 재고를 재 계산 해 달라는 요청 입니다.
WITH t_inv AS ( SELECT '202301' yyyymm, 'A' cd, 10 begin_qty, 50 in_qty, 50 out_qty FROM dual UNION ALL SELECT '202302', 'A', 0, 50, 50 FROM dual UNION ALL SELECT '202303', 'A', 0, 50, 50 FROM dual UNION ALL SELECT '202304', 'A', 10, 50, 40 FROM dual UNION ALL SELECT '202305', 'A', 10, 50, 50 FROM dual UNION ALL SELECT '202306', 'A', 0, 50, 60 FROM dual ) SELECT yyyymm , cd , begin_qty + sum_qty - (in_qty - out_qty) begin_qty , in_qty , out_qty , begin_qty + sum_qty end_qty FROM (SELECT yyyymm , cd , in_qty , out_qty , FIRST_VALUE(begin_qty) OVER(PARTITION BY cd ORDER BY yyyymm) begin_qty , SUM(in_qty - out_qty) OVER(PARTITION BY cd ORDER BY yyyymm) sum_qty FROM t_inv WHERE yyyymm BETWEEN SUBSTR('202302', 1, 4) AND '202306' -- 1월부터 검색되도록 ) WHERE yyyymm BETWEEN '202302' AND '202306' ;