아래와 같이 데이터가 있을때 원하는 컬럼만 행열을 변환하고 싶습니다.
예시 데이터로 ID값을 3종류로 하였으나 실제값은 GROUP BY 시 32개값이 나오고 CODE값은 1000개정도 됩니다.
ID | CODE | VAL1 | VAL2 | VAL3 |
100 | 1 | d | t | h |
100 | 2 | r | g | gf |
100 | 3 | f | s | d |
200 | 1 | c | f | r |
200 | 2 | z | f | f |
200 | 3 | c | vd | g |
300 | 1 | z | d | d |
300 | 2 | ds | df | f |
300 | 3 | a | d | f |
원하는 결과
- ID값이 열로 바뀌면서 CODE에 해당하는 VAL1, VAL2, VAL3값을 가져오면 됩니다.
PIVOT함수를 사용해서 하면 될 것 같은데 너무 헷갈리네요ㅠ
ID | 100 | 200 | 300 | 400 | 500........3200 | ||||||||||
CODE | VAL1 | VAL2 | VAL3 | VAL1 | VAL2 | VAL3 | VAL1 | VAL2 | VAL3 | VAL1 | VAL2 | VAL3 | VAL1 | VAL2 | VAL3 |
1 | d | t | h | c | f | r | z | d | d | ||||||
2 | r | g | gf | z | f | f | ds | df | f | ||||||
3 | f | s | d | c | vd | g | a | d | f |
.
.
1000
WITH t AS ( SELECT 100 id, 1 code, 'd' val1, 't' val2, 'h' val3 FROM dual UNION ALL SELECT 100, 2, 'r' , 'g' , 'gf' FROM dual UNION ALL SELECT 100, 3, 'f' , 's' , 'd' FROM dual UNION ALL SELECT 200, 1, 'c' , 'f' , 'r' FROM dual UNION ALL SELECT 200, 2, 'z' , 'f' , 'f' FROM dual UNION ALL SELECT 200, 3, 'c' , 'vd', 'g' FROM dual UNION ALL SELECT 300, 1, 'z' , 'd' , 'd' FROM dual UNION ALL SELECT 300, 2, 'ds', 'df', 'f' FROM dual UNION ALL SELECT 300, 3, 'a' , 'd' , 'f' FROM dual ) SELECT * FROM t PIVOT (MIN(val1) val1, MIN(val2) val2, MIN(val3) val3 FOR id IN (100, 200, 300, 400)) ;