DB(MySql) 에서
cal1 cal2 cal3
---------------
1 2 3
a b c
A B C
로 들어가 있는 데이터를
1 a A
2 b B
3 c C
로 바꿔서 출력 하고 싶습니다
(1 2 3 부분은 월 이니 12개 고정 입니다.)
-- PIVOT(행을 열로) -- SELECT m , MIN(CASE idx WHEN 1 THEN v END) v1 , MIN(CASE idx WHEN 2 THEN v END) v2 FROM (-- UNPIVOT(열을 행으로) -- SELECT a.idx , b.m , CASE b.m WHEN 1 THEN m01 WHEN 2 THEN m02 WHEN 3 THEN m03 WHEN 4 THEN m04 WHEN 5 THEN m05 WHEN 6 THEN m06 WHEN 7 THEN m07 WHEN 8 THEN m08 WHEN 9 THEN m09 WHEN 10 THEN m10 WHEN 11 THEN m11 WHEN 12 THEN m12 END v FROM (-- 원본 테이블 -- SELECT 1 idx , 'a' m01, 'b' m02, 'c' m03, 'd' m04, 'e' m05, 'f' m06 , 'g' m07, 'h' m08, 'i' m09, 'j' m10, 'k' m11, 'l' m12 UNION ALL SELECT 2 , 'A', 'B', 'C', 'D', 'E', 'F' , 'G', 'H', 'I', 'J', 'K', 'L' ) a , (-- 복제용 테이블 -- SELECT 1 m UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) b ) c GROUP BY m ;
행을 열로 바꿀때 중요한 것은 열의 기준이 되는 값들의 종류와 갯수를 정확하게 알고 있어야 한다는 것입니다. 예를 들면 "월"을 기준으로 한다 라고 하면 그 값은 1 부터 12 까지 12개 라는 명확한 기준이 존재하는 거구요. 이렇게 기준이 명확할 경우 행을 12개의 열로 변환이 가능합니다. 반면에 그 기준이 명확하지 않은 경우? 갯수가 가변인 경우? 이 경우는 SQL만으로는 불가능 합니다. 동적SQL로 해야 하구요.