기존 분류
| File_Type2 | File_Type | SoldFlag |
|---|---|---|
| 1. Active | Active | - |
| 2. Semi-Active | Historical | 6개월 이내 판매 O |
| 3. Historical | Historical | 6개월 이내 판매 X |
더 드릴다운한 분류
| File_Type2 | SKU Grade |
|---|---|
| 1. Active | S / A / B |
| 2. Semi-Active | C / D / E |
| 3. Historical | F |
S : Inven_unit 상위 10%이내
A : Inven_unit 상위 10%~50%
B : Inven_unit 상위 50% 초과
C : Inven_unit 상위 50%이내 & Month of coverage가 60개월 미만
D : Inven_unit 상위 50% 초과 & Month of coverage가 60개월 미만
E : C, D 등급 조건에 해당 되지 않는 경우
F : Historical 재고 중 6개월 이내 판매 이력이 없는 경우
ㄴ SKU_number별 File_Type2, inven_unit, sold_unit 정보 기본 테이블 생성하기
SELECT SKU_number,
CASE
WHEN File_Type = 'Active' THEN '1. Active'
WHEN File_Type = 'Historical' AND SoldFlag = 1 THEN '2. Semi-Active'
WHEN File_Type = 'Historical' AND SoldFlag = 0 THEN '3. Historical'
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
;
<결과>
ㄴ (1)번 테이블을 WITH절에 넣고 ,
inven_unit 상위 N% 컬럼 추가 (percent_rank())
month of coverage 컬럼 추가 (inven_unit / Monthly Average sold_unit)
(Monthly Average sold_unit은 sold_unit이6개월이내에 팔린 내역이니 6으로 나누면 된다)
with sku_1 as
(
SELECT SKU_number,
CASE
WHEN File_Type = 'Active' THEN '1. Active'
WHEN File_Type = 'Historical' AND SoldFlag = 1 THEN '2. Semi-Active'
WHEN File_Type = 'Historical' AND SoldFlag = 0 THEN '3. Historical'
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 SKU_number, File_Type_2, inven_unit, sold_unit
, inven_unit / (sold_unit/6) AS MOC
, percent_rank() OVER (PARTITION BY File_Type_2 ORDER BY inven_unit DESC) * 100 AS pct
FROM sku_1
;
ㄴ CASE WHEN절을 사용하여 SKU_Grade 컬럼 조건문 만들기
WITH sku_1 AS
(
SELECT SKU_number,
CASE
WHEN File_Type = 'Active' THEN '1. Active'
WHEN File_Type = 'Historical' AND SoldFlag = 1 THEN '2. Semi-active'
WHEN File_Type = 'Historical' AND SoldFlag = 0 THEN '3. Historical'
ELSE 'Others'
END AS File_Type_2,
SUM(ItemCount) AS inven_unit,
SUM(SoldCount) AS sold_unit
FROM inventory.inventory i
GROUP BY SKU_number,
CASE
WHEN File_Type = 'Active' THEN '1. Active'
WHEN File_Type = 'Historical' AND SoldFlag = 1 THEN '2. Semi-active'
WHEN File_Type = 'Historical' AND SoldFlag = 0 THEN '3. Historical'
ELSE 'Others'
END
ORDER BY SKU_number,
CASE
WHEN File_Type = 'Active' THEN '1. Active'
WHEN File_Type = 'Historical' AND SoldFlag = 1 THEN '2. Semi-active'
WHEN File_Type = 'Historical' AND SoldFlag = 0 THEN '3. Historical'
ELSE 'Others'
END
),
sku_2 AS
(
SELECT SKU_number, File_Type_2, inven_unit, sold_unit,
inven_unit / NULLIF(sold_unit / 6, 0) AS MOC,
percent_rank() OVER (PARTITION BY File_Type_2 ORDER BY inven_unit DESC) * 100 AS pct
FROM sku_1
)
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
;
방금 만들어준 테이블도 sku_2라는 이름으로 임시테이블 생성
Division by 0이라는 문제발생
Division by 0 : 나누기를 하는데 분모에 0이 존재-> 분모를 0대신에 Null로 치환
앞서서는 문장 전체가 아니라 화면에 제한적으로 표시되도록 해놓은 설정때문에 error가 없었지만 with절을 사용해 테이블로 사용하면서 전체 테이블로 계산이 되니 오류가 생긴 것
Nullif (표현식 1, 표현식2)
: 표현식1이 표현식2와 같은면 Null, 같지 않으면 표현식1을 리턴한다
inven_unit / if(sold_unit=0, Null, sold_unit / 6) 도 동일한 결과
A등급 조건에 10 <= pct and pct < 50 해주지 않아도 위에 S등급 조건이 먼저 걸리기 때문에 10 <= pct는 빼줘도 됨
나머지 조건들도 동일
<결과>
ㄴ 'sku_grade' 신규테이블 create 및 insert
CREATE TABLE inventory.sku_grade AS
(
WITH sku_1 AS
(
SELECT SKU_number,
CASE
WHEN File_Type = 'Active' THEN '1. Active'
WHEN File_Type = 'Historical' AND SoldFlag = 1 THEN '2. Semi-active'
WHEN File_Type = 'Historical' AND SoldFlag = 0 THEN '3. Historical'
ELSE 'Others'
END AS File_Type_2,
SUM(ItemCount) AS inven_unit,
SUM(SoldCount) AS sold_unit
FROM inventory.inventory i
GROUP BY SKU_number,
CASE
WHEN File_Type = 'Active' THEN '1. Active'
WHEN File_Type = 'Historical' AND SoldFlag = 1 THEN '2. Semi-active'
WHEN File_Type = 'Historical' AND SoldFlag = 0 THEN '3. Historical'
ELSE 'Others'
END
ORDER BY SKU_number,
CASE
WHEN File_Type = 'Active' THEN '1. Active'
WHEN File_Type = 'Historical' AND SoldFlag = 1 THEN '2. Semi-active'
WHEN File_Type = 'Historical' AND SoldFlag = 0 THEN '3. Historical'
ELSE 'Others'
END
),
sku_2 AS
(
SELECT SKU_number, File_Type_2, inven_unit, sold_unit,
inven_unit / NULLIF(sold_unit / 6, 0) AS MOC,
percent_rank() OVER (PARTITION BY File_Type_2 ORDER BY inven_unit DESC) * 100 AS pct
FROM sku_1
)
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
)
;
SELECT File_Type_2 , SKU_Grade , count(DISTINCT SKU_number) AS sku_cnt
FROM inventory.sku_grade sg
GROUP BY 1,2
ORDER BY 1,2
;
<결과>
