그림과 같이 언피벗에 대해 정리 했눈데 저런식으로 정리 한게 맞나여?
피벗 언피벗 쓸때마다 자꾸 뭔가가 헷갈려서..
피벗은
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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)
-------------------------------------------------------
쉽게 설명하려고 했는데 적어놓고 보니 어렵네요; 그냥 많이 쓰다보면 감이 오실 겁니다. 많이 실습해보세요.