전제 조건 PRICE가 0일 경우 1,2,3번 의 순서로 보정한다.
1 ITEM, LINE, WEEK 기준 PRICE
2 ITEM, LINE 기준 MAX(PRICE)
3 ITEM 기준 (PRICE)
4. 1,2,3 번 모두 거쳐도 값이 0 이라면 0
JORDAN의 경우 1번 로직 적합 으로 PRICE = 20
SON의 경우 동일 week 없어 1번로직 불가, 2번로직 으로 ITEM,LINE 기준 MAX 값 = 20
PART 의 경우 1,2번 로직 불가로 3 순서 ITEM 기준으로 MAX 값 = 20
CASE문으로는 해결을 못하고있는것같아서, 어떤 좋은 방법이 있을까요??
샘플
WITH TEST AS ( SELECT 'JORDAN' ITEM, 'AR_JORDAN' LINE , '202340' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'JORDAN' ITEM, 'AR_JORDAN' LINE , '202339' WEEK, 15 PRICE FROM DUAL UNION ALL SELECT 'JORDAN' ITEM, 'AR_JORDAN' LINE , '202339' WEEK, 10 PRICE FROM DUAL UNION ALL SELECT 'JORDAN' ITEM, 'AR_JORDAN' LINE , '202340' WEEK, 0 PRICE FROM DUAL UNION ALL SELECT 'SON' ITEM, 'AR_SON' LINE , '-' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'SON' ITEM, 'AR_SON' LINE , '-' WEEK, 10 PRICE FROM DUAL UNION ALL SELECT 'SON' ITEM, 'AR_SON' LINE , '-' WEEK, 10 PRICE FROM DUAL UNION ALL SELECT 'SON' ITEM, 'AR_SON' LINE , '202339' WEEK, 0 PRICE FROM DUAL UNION ALL SELECT 'PARK' ITEM, 'AR_PARK' LINE , '202339' WEEK, 10 PRICE FROM DUAL UNION ALL SELECT 'PARK' ITEM, 'AR_PARK' LINE , '-' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'PARK' ITEM, 'AR_PARK' LINE , '-' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'PARK' ITEM, 'AC_PARK' LINE , '202339' WEEK, 0 PRICE FROM DUAL ) SELECT * FROM TEST
ITEM | LINE | WEEK | PRICE |
JORDAN | AR_JORDAN | 202340 | 20 |
JORDAN | AR_JORDAN | 202339 | 15 |
JORDAN | AR_JORDAN | 202339 | 10 |
JORDAN | AR_JORDAN | 202340 | 0 |
SON | AR_SON | - | 20 |
SON | AR_SON | - | 10 |
SON | AR_SON | - | 10 |
SON | AR_SON | 202339 | 0 |
PARK | AR_PARK | 202339 | 10 |
PARK | AR_PARK | - | 20 |
PARK | AR_PARK | - | 20 |
PARK | AC_PARK | 202339 | 0 |
원하는 결과
WITH TEST AS ( SELECT 'JORDAN' ITEM, 'AR_JORDAN' LINE , '202340' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'JORDAN' ITEM, 'AR_JORDAN' LINE , '202339' WEEK, 15 PRICE FROM DUAL UNION ALL SELECT 'JORDAN' ITEM, 'AR_JORDAN' LINE , '202339' WEEK, 10 PRICE FROM DUAL UNION ALL SELECT 'JORDAN' ITEM, 'AR_JORDAN' LINE , '202340' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'SON' ITEM, 'AR_SON' LINE , '-' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'SON' ITEM, 'AR_SON' LINE , '-' WEEK, 10 PRICE FROM DUAL UNION ALL SELECT 'SON' ITEM, 'AR_SON' LINE , '-' WEEK, 10 PRICE FROM DUAL UNION ALL SELECT 'SON' ITEM, 'AR_SON' LINE , '202339' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'PARK' ITEM, 'AR_PARK' LINE , '202339' WEEK, 10 PRICE FROM DUAL UNION ALL SELECT 'PARK' ITEM, 'AR_PARK' LINE , '-' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'PARK' ITEM, 'AR_PARK' LINE , '-' WEEK, 20 PRICE FROM DUAL UNION ALL SELECT 'PARK' ITEM, 'AC_PARK' LINE , '202339' WEEK, 20 PRICE FROM DUAL ) SELECT * FROM TEST
ITEM | LINE | WEEK | PRICE |
JORDAN | AR_JORDAN | 202340 | 20 |
JORDAN | AR_JORDAN | 202339 | 15 |
JORDAN | AR_JORDAN | 202339 | 10 |
JORDAN | AR_JORDAN | 202340 | 20 |
SON | AR_SON | - | 20 |
SON | AR_SON | - | 10 |
SON | AR_SON | - | 10 |
SON | AR_SON | 202339 | 20 |
PARK | AR_PARK | 202339 | 10 |
PARK | AR_PARK | - | 20 |
PARK | AR_PARK | - | 20 |
PARK | AC_PARK | 202339 | 20 |
PRICE 0 에 조건에 맞는 price 값을 넣고싶습니다.
WITH test AS ( SELECT 'JORDAN' item, 'AR_JORDAN' line, '202340' week, 20 price FROM dual UNION ALL SELECT 'JORDAN', 'AR_JORDAN', '202339', 15 FROM dual UNION ALL SELECT 'JORDAN', 'AR_JORDAN', '202339', 10 FROM dual UNION ALL SELECT 'JORDAN', 'AR_JORDAN', '202340', 0 FROM dual -- Case 1 UNION ALL SELECT 'SON' , 'AR_SON' , '-' , 20 FROM dual UNION ALL SELECT 'SON' , 'AR_SON' , '-' , 10 FROM dual UNION ALL SELECT 'SON' , 'AR_SON' , '-' , 10 FROM dual UNION ALL SELECT 'SON' , 'AR_SON' , '202339', 0 FROM dual -- Case 2 UNION ALL SELECT 'PARK' , 'AR_PARK' , '202339', 10 FROM dual UNION ALL SELECT 'PARK' , 'AR_PARK' , '-' , 20 FROM dual UNION ALL SELECT 'PARK' , 'AR_PARK' , '-' , 20 FROM dual UNION ALL SELECT 'PARK' , 'AC_PARK' , '202339', 0 FROM dual -- Case 3 ) SELECT item , line , week , price , COALESCE(NULLIF(price, 0) , MAX(NULLIF(price, 0)) OVER(PARTITION BY item, line, week) , MAX(NULLIF(price, 0)) OVER(PARTITION BY item, line) , MAX(NULLIF(price, 0)) OVER(PARTITION BY item) , 0) price_new FROM test ORDER BY ROWNUM ;