sku_1이라는 임시 집계 테이블 만들기sku_number별 file_type, inven_unit, sold_unit 계산Active/Historical + soldflag 조합으로 “1. Active”, “2. Semi-Active”, “3. Historical”, “Others” 분류sku_2라는 임시 테이블에서 추가 연산MOC(Month of coverage) = inven_unit / (sold_unit / 6) (월 평균 판매량을 sold_unit/6으로 가정)percent_rank()를 이용해 inven_unit 상위 퍼센트(pct)를 구함sku_grade 결정file_type_2가 “1. Active”이면서 pct < 10이면 ‘S’file_type_2가 “1. Active”이면서 pct < 50이면 ‘A’, else ‘B’file_type_2가 “2. Semi-Active”이면서 MOC 조건 등에 따라 ‘C’, ‘D’, ‘E’CREATE TABLE ... AS SELECT(CTAS) 형태로 실제 물리 테이블(Inventory.sku_grade) 생성 후, SELECT로 확인sku_1 임시 결과 (WITH 구문)sql
코드 복사
WITH sku_1 AS (
SELECT
sku_number,
CASE
WHEN file_type = 'Historical' AND soldflag = 1 THEN '2. Semi-Active'
WHEN file_type = 'Historical' AND soldflag = 0 THEN '3. Historical'
WHEN file_type = 'Active' THEN '1. Active'
ELSE 'Others'
END AS file_type_2,
SUM(itemcount) AS inven_unit,
SUM(soldcount) AS sold_unit
FROM Inventory.Inventory i
GROUP BY 1, 2
ORDER BY 1, 2
)
SELECT * FROM sku_1;
CASE: file_type와 soldflag 조합을 기반으로 “1. Active”, “2. Semi-Active”, “3. Historical” 등을 부여SUM(itemcount) AS inven_unit: SKU별 재고 합계SUM(soldcount) AS sold_unit: SKU별 판매 합계sku_1 임시 테이블에는 (sku_number, file_type_2, inven_unit, sold_unit)가 모이게 됨.sku_2에서 추가 계산sql
코드 복사
sku_2 AS (
SELECT
sku_number,
file_type_2,
inven_unit,
sold_unit,
-- MOC: 재고 보유량 / 월평균 판매
inven_unit / IF(sold_unit=0, NULL, sold_unit / 6) AS MOC,
-- inven_unit 상위 퍼센트: PERCENT_RANK() OVER (PARTITION BY file_type_2 ORDER BY inven_unit DESC)*100
percent_rank() OVER (
PARTITION BY file_type_2
ORDER BY inven_unit DESC
) * 100 AS pct
FROM sku_1
)
SELECT * FROM sku_2;
MOC(Month of coverage) = inven_unit / (sold_unit / 6)sold_unit/6을 “월평균 판매량”이라고 가정(즉, 6개월 동안의 판매수 sold_unit을 6으로 나눠 월 판매 추정).IF(sold_unit=0, NULL, ...): 판매가 전혀 없으면 NULL로 처리(무한대 or 계산 불가로 간주).percent_rank(): 동일한 file_type_2 그룹 내에서 inven_unit DESC 기준 상위 몇 퍼센트인지 계산100 하여 실제 퍼센티지(pct)로 변환sku_grade 부여sql
코드 복사
SELECT
sku_number,
file_type_2,
CASE
WHEN file_type_2 = '1. Active' AND pct < 10 THEN 'S'
WHEN file_type_2 = '1. Active' AND pct < 50 THEN 'A'
WHEN file_type_2 = '1. Active' THEN 'B'
WHEN file_type_2 = '2. Semi-Active' AND pct <= 50 AND MOC < 60 THEN 'C'
WHEN file_type_2 = '2. Semi-Active' AND MOC < 60 THEN 'D'
WHEN file_type_2 = '2. Semi-Active' THEN 'E'
ELSE 'F'
END AS SKU_Grade
FROM sku_2;
pct < 10 → S, pct < 50 → A, 그 외 Bsql
코드 복사
CREATE TABLE Inventory.sku_grade AS
WITH sku_1 AS (
...
),
sku_2 AS (
...
)
SELECT
sku_number,
file_type_2,
CASE
...
END AS SKU_Grade
FROM sku_2;
CREATE TABLE ... AS SELECT(CTAS) 구문으로 Inventory.sku_grade 테이블 생성SELECT file_type_2, sku_grade, COUNT(DISTINCT sku_number) ... 하면 등급별 SKU 수를 확인 가능WITH sku_1에서 먼저 file_type_2, inven_unit, sold_unit 등을 집계WITH sku_2에서 MOC, pct 계산CASE WHEN으로 등급 분류percent_rank() 함수 활용PARTITION BY file_type_2 ORDER BY inven_unit DESCfile_type_2 그룹 내에서 재고량이 어느 퍼센트 지점인지 판단할 수 있음inven_unit / (sold_unit / 6) : 6개월치 판매수로부터 월평균 판매량 추정file_type_2 = '1. Active' → S, A, B (재고 상위 10%, 50%, 그 외)file_type_2 = '2. Semi-Active' → MOC와 pct 조건으로 C, D, ECREATE TABLE ... AS SELECT는 대용량 테이블 생성 시 리소스 많이 사용NULL로 처리하여 MOC 계산 불가로 둠NTILE(10) 분할도 가능percent_rank()는 분위로 자연스럽게 분포를 보고 싶을 때 쓸 수 있음이 로직을 통해 SKU 재고를 “Active / Semi-Active / Historical”로 우선 분류하고,
각 그룹 내에서 재고량 percentile(pct)와 Month of coverage(MOC) 기준으로
S, A, B, C, D, E, F 등 세분화된 등급을 생성할 수 있습니다.
sku_1, sku_2) 생성CASE WHEN으로 새 컬럼(sku_grade) 분류CREATE TABLE AS로 결과 테이블 생성분류가 끝나면 이 테이블(Inventory.sku_grade)을 기반으로 SKU별 재고 전략(발주, 프로모션, 폐기 등)을 수립할 수 있습니다.