oracle pivot 조건 0 2 1,809

by 아카펠라 [SQL Query] [2017.02.06 16:05:18]


안녕하세요. 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으로 간단하게 처리할 수 있는 방법이 있을까요...

 

by 마농 [2017.02.06 16:45:10]

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))
;

 


by 아카펠라 [2017.02.06 17:00:14]

아... 간단하게 사용되는 문법은 없나 보네요..

그래도 좋은방법 배워갑니다. 감사합니다!!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입