그림과 같이 언피벗에 대해 정리 했눈데 저런식으로 정리 한게 맞나여?
피벗 언피벗 쓸때마다 자꾸 뭔가가 헷갈려서..
피벗은
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절에서 해주고 그룹바이는 할거는 자기가 알아서 찾아서 해준다고 생각하는게 맞나여?
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)
-------------------------------------------------------
쉽게 설명하려고 했는데 적어놓고 보니 어렵네요; 그냥 많이 쓰다보면 감이 오실 겁니다. 많이 실습해보세요.