선입선출 조회 쿼리 0 2 9,548

by jmh [SQL Query] MSSQL 선입선출 재고 연령조회 [2020.10.26 11:18:45]


아래와 같은 표의 데이터가 있습니다.

조회 기준은 조회년월로서 기초 + 입고 - 출고 = 기말재고의 형식인데,

이 데이터로 재고 연령조회를 해야합니다.

예를들어, 2020년 10월 기준 조회했을 때 품목명 / 1년미만 / 1년~2년 / 2년~3년 / 3년이상 의 네가지로 분류하여 조회해야되는데,

선입선출로 조회하여 각 년도별 몇개의 재고가 남았는지 확인하고싶습니다.

아래의 표를 예시로 2020년 10월로 조회했을 때

품목명 / 1년 미만 / 1년 ~ 2년 / 2년 ~ 3년 / 3년 이상

  A           500            0             0            408      (총 재고의 합은 2020년 10월 기말재고)

고수님들의 조언을 듣고싶습니다.

조회년월 항목코드 기초재고 입고 출고 기말재고
201701 1010010010001 176 0 0 176
201702 176 1032 12 1196
201703 1196 0 0 1196
201704 1196 0 0 1196
201705 1196 8 16 1188
201706 1188 0 0 1188
201707 1188 40 80 1148
201708 1148 20 40 1128
201709 1128 64 64 1128
201710 1128 0 0 1128
201711 1128 40 144 1024
201712 1024 0 0 1024
201801 1024 80 80 1024
201802 1024 1536 1536 1024
201803 1024 0 0 1024
201804 1024 120 120 1024
201805 1024 0 0 1024
201806 1024 560 560 1024
201807 1024 0 0 1024
201808 1024 0 0 1024
201809 1024 0 0 1024
201810 1024 0 0 1024
201811 1024 24 24 1024
201812 1024 0 0 1024
201901 1024 0 0 1024
201902 1024 0 0 1024
201903 1024 40 40 1024
201904 1024 180 200 1004
201905 1004 0 0 1004
201906 1004 0 0 1004
201907 1004 0 0 1004
201908 1004 176 176 1004
201909 1004 0 0 1004
201910 1004 40 40 1004
201911 1004 48 48 1004
201912 1004 192 288 908
202001 908 80 80 908
202002 908 0 0 908
202003 908 80 80 908
202004 908 80 80 908
202005 908 1240 1240 908
202006 908 0 0 908
202007 908 0 0 908
202008 908 80 80 908
202009 908 80 80 908
202010 908 112 112 908

 

 

by 마농 [2020.10.27 09:16:38]

선입선출이라면?
결과가 이상한데요?
최신 자재만 908 이 남아야 할 것 같은데.
3년전 자재가 408 이 남아 있네요?
과거 자재부터 출고되어야 하는데 과거자재를 남기고 최신자재를 출고한다는 의미가 되는데요?


by 마농 [2020.10.28 13:58:11]
WITH t AS
(
SELECT '201701' ym, 'A' cd, 176 s, 0 i, 0 o, 176 e
UNION ALL SELECT '201702', 'A',  176, 1032,   12, 1196
UNION ALL SELECT '201703', 'A', 1196,    0,    0, 1196
UNION ALL SELECT '201704', 'A', 1196,    0,    0, 1196
UNION ALL SELECT '201705', 'A', 1196,    8,   16, 1188
UNION ALL SELECT '201706', 'A', 1188,    0,    0, 1188
UNION ALL SELECT '201707', 'A', 1188,   40,   80, 1148
UNION ALL SELECT '201708', 'A', 1148,   20,   40, 1128
UNION ALL SELECT '201709', 'A', 1128,   64,   64, 1128
UNION ALL SELECT '201710', 'A', 1128,    0,    0, 1128
UNION ALL SELECT '201711', 'A', 1128,   40,  144, 1024
UNION ALL SELECT '201712', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201801', 'A', 1024,   80,   80, 1024
UNION ALL SELECT '201802', 'A', 1024, 1536, 1536, 1024
UNION ALL SELECT '201803', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201804', 'A', 1024,  120,  120, 1024
UNION ALL SELECT '201805', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201806', 'A', 1024,  560,  560, 1024
UNION ALL SELECT '201807', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201808', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201809', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201810', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201811', 'A', 1024,   24,   24, 1024
UNION ALL SELECT '201812', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201901', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201902', 'A', 1024,    0,    0, 1024
UNION ALL SELECT '201903', 'A', 1024,   40,   40, 1024
UNION ALL SELECT '201904', 'A', 1024,  180,  200, 1004
UNION ALL SELECT '201905', 'A', 1004,    0,    0, 1004
UNION ALL SELECT '201906', 'A', 1004,    0,    0, 1004
UNION ALL SELECT '201907', 'A', 1004,    0,    0, 1004
UNION ALL SELECT '201908', 'A', 1004,  176,  176, 1004
UNION ALL SELECT '201909', 'A', 1004,    0,    0, 1004
UNION ALL SELECT '201910', 'A', 1004,   40,   40, 1004
UNION ALL SELECT '201911', 'A', 1004,   48,   48, 1004
UNION ALL SELECT '201912', 'A', 1004,  192,  288,  908
UNION ALL SELECT '202001', 'A',  908,   80,   80,  908
UNION ALL SELECT '202002', 'A',  908,    0,    0,  908
UNION ALL SELECT '202003', 'A',  908,   80,   80,  908
UNION ALL SELECT '202004', 'A',  908,   80,   80,  908
UNION ALL SELECT '202005', 'A',  908, 1240, 1240,  908
UNION ALL SELECT '202006', 'A',  908,    0,    0,  908
UNION ALL SELECT '202007', 'A',  908,    0,    0,  908
UNION ALL SELECT '202008', 'A',  908,   80,   80,  908
UNION ALL SELECT '202009', 'A',  908,   80,   80,  908
UNION ALL SELECT '202010', 'A',  908,  112,  112,  908
)
SELECT cd
     , ISNULL(SUM(CASE y WHEN 0 THEN v END), 0) "1년미만"
     , ISNULL(SUM(CASE y WHEN 1 THEN v END), 0) "1년~2년"
     , ISNULL(SUM(CASE y WHEN 2 THEN v END), 0) "2년~3년"
     , ISNULL(SUM(CASE y WHEN 3 THEN v END), 0) "3년이상"
  FROM (SELECT cd
             , y
             , CASE WHEN i_sum <= e_last THEN i ELSE e_last - i_sum + i END v
          FROM (SELECT ym, cd, s, i, o, e
                     , DATEDIFF( mm
                       , CAST(CONCAT(ym      , '01') AS DATE)
                       , CAST(CONCAT('202010', '01') AS DATE)
                       ) / 12 y
                     , SUM(i) OVER(ORDER BY ym DESC) i_sum
                     , MIN(CASE WHEN ym = '202010' THEN e END) OVER() e_last
                  FROM t
                 WHERE ym <= '202010'
                ) a
         WHERE i_sum - i < e_last
           AND i > 0
        ) a
 GROUP BY cd
;

 

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