PIVOT, UNPIVOT 질문 1 2 1,855

by 고수가되고싶어요 [Oracle 기초] [2017.12.14 11:50:28]


image.png (40,449Bytes)

그림과 같이 언피벗에 대해 정리 했눈데 저런식으로 정리 한게 맞나여? 

피벗 언피벗 쓸때마다 자꾸 뭔가가 헷갈려서..

 

피벗은

WITH t AS
(
SELECT '2017-10-01' dt, 1 num FROM dual
UNION ALL SELECT '2017-10-01', 2 FROM dual
UNION ALL SELECT '2017-10-01', 3 FROM dual
UNION ALL SELECT '2017-10-02', 4 FROM dual
UNION ALL SELECT '2017-10-02', 5 FROM dual
UNION ALL SELECT '2017-10-02', 6 FROM dual
UNION ALL SELECT '2017-10-03', 7 FROM dual
UNION ALL SELECT '2017-10-03', 8 FROM dual
UNION ALL SELECT '2017-10-03', 9 FROM dual
)
-- Group By, Min(Decode(
SELECT dt
     , MIN(DECODE(rn, 1, num)) n1
     , MIN(DECODE(rn, 2, num)) n2
     , MIN(DECODE(rn, 3, num)) n3
  FROM (SELECT dt, num
             , ROW_NUMBER() OVER(PARTITION BY dt ORDER BY num) rn
          FROM t
        )
 GROUP BY dt
 ORDER BY dt
;
-- 11G Pivot
SELECT *
  FROM (SELECT dt, num
             , ROW_NUMBER() OVER(PARTITION BY dt ORDER BY num) rn
          FROM t
        )
 PIVOT (MIN(num) FOR rn IN (1, 2, 3))
 ORDER BY dt
;

위 쿼리로 보자면 decode, min 을 pivot절에서 해주고 그룹바이는 할거는 자기가 알아서 찾아서 해준다고 생각하는게 맞나여? 

by jkson [2017.12.14 18:46:22]

PIVOT (MIN(num) FOR rn IN (1 as v1, 2 as v2, 3 as v3))

-> 풀어보면

rn 값이 1, 2, 3인 데이터에 대해 각각 열을 만들어 줄 것이고 각 열의 이름은 v1, v2, v3입니다.

각 열의 값은 min(num)으로 하겠습니다.

group by의 기준은 pivot절에 한번도 나열되지 않은 컬럼을 기준으로 합니다.

(여기서는 dt가 pivot절에 없으므로 group by dt)

-------------------------------------------------------

쉽게 설명하려고 했는데 적어놓고 보니 어렵네요; 그냥 많이 쓰다보면 감이 오실 겁니다. 많이 실습해보세요.


by 고수가되고싶어요 [2017.12.15 09:16:28]

감사합니다.

많은 도움 되었습니다.

unpivot은 마지막 그림과 같이 이해해도 되나여??

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