아래와 같은 표의 데이터가 있습니다.
조회 기준은 조회년월로서 기초 + 입고 - 출고 = 기말재고의 형식인데,
이 데이터로 재고 연령조회를 해야합니다.
예를들어, 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 |
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 ;