안녕하세요. pivot 관련 질문을 드리려고 합니다.
WITH T AS( SELECT '12' AS SIZ, 30 QTY, 1.5 AS FRT FROM DUAL UNION ALL SELECT '20' , 15, 1 FROM DUAL UNION ALL SELECT '2A' , 25, 1.2 FROM DUAL UNION ALL SELECT '40' , 30, 1.3 FROM DUAL UNION ALL SELECT '43' , 22, 1.4 FROM DUAL UNION ALL SELECT '45' , 45, 1.5 FROM DUAL UNION ALL SELECT '4A' , 13, 1.6 FROM DUAL UNION ALL SELECT '20' , 11, 1.7 FROM DUAL ) SELECT NVL(SUM(CASE WHEN SIZ = '12' THEN QTY END), 0) AS A12 , NVL(SUM(CASE WHEN SIZ = '20' OR SIZ = '2A' THEN QTY END), 0) AS A20 , NVL(SUM(CASE WHEN SIZ = '40' THEN QTY END), 0) AS A40 , NVL(SUM(CASE WHEN SIZ = '43' OR SIZ = '4A' OR SIZ = '45' THEN QTY END), 0) AS A40A , NVL(SUM(FRT * QTY), 0) AS FRT FROM T
위와 같은 쿼리가 있는데요 PIVOT 함수를 사용해서 바꾸려고 합니다.
기본적인 PIVOT 문법은 알고 있는데요..
SUM()함수 안에 CASE조건이 들어가는데 이런 경우에는 어떻게 처리해야 할지 잘 모르겠네요..
PIVOT으로 간단하게 처리할 수 있는 방법이 있을까요...
PIVOT 이 편하기도 하지만
정해진 틀에 맞춰야 하므로 다양한 조건에 따른 변화는 어렵죠.
qty 는 피벗 합계가 맞지만? frt 는 전체 합계를 구해야 하네요.
이렇게 서로 다른 기준이 공존하는 경우도 어렵습니다.
억지로 끼워맞출 수는 있습니다만.
이럴바엔 차라리 예전 방식이 편할 수 있습니다.
WITH t AS ( SELECT '12' siz, 30 qty, 1.5 frt FROM dual UNION ALL SELECT '20', 15, 1.0 FROM dual UNION ALL SELECT '2A', 25, 1.2 FROM dual UNION ALL SELECT '40', 30, 1.3 FROM dual UNION ALL SELECT '43', 22, 1.4 FROM dual UNION ALL SELECT '45', 45, 1.5 FROM dual UNION ALL SELECT '4A', 13, 1.6 FROM dual UNION ALL SELECT '20', 11, 1.7 FROM dual ) SELECT a12 , a20 , a40 , a40a , frt FROM (SELECT CASE WHEN siz = '12' THEN 'A12' WHEN siz IN ('20', '2A') THEN 'A20' WHEN siz = '40' THEN 'A40' WHEN siz IN ('43', '4A', '45') THEN 'A40A' END gb , qty , SUM(frt * qty) OVER() AS frt FROM t ) PIVOT (SUM(qty) FOR gb IN ('A12' A12, 'A20' A20, 'A40' A40, 'A40A' A40A)) ;