TABLE 명 : T_TEST
T_NAME | T_VAL | T_VAL2 | T_VAL3 | T_ORD |
JONES | A1 | 10 | 가 | 1 |
JONES | A2 | 10 | 나 | 2 |
JONES | A3 | 15 | 가 | 3 |
JONES | A4 | 12 | 나 | 4 |
JONES | A5 | 12 | 가 | 5 |
JONES | A6 | 17 | 가 | 6 |
JONES | A7 | 11 | 가 | 7 |
CASEY | B1 | 8 | 다 | 11 |
CASEY | B2 | 3 | 다 | 12 |
CASEY | B3 | 4 | 다 | 13 |
CASEY | B4 | 4 | 라 | 14 |
CASEY | B5 | 0 | 라 | 15 |
원하는 결과값 .
T_NAME | COL1 | COL2 | COL3 | COL4 | COL5 |
JONES | A1 | A2 | A3 | A4 | A5 |
JONES | 10 | 10 | 15 | 12 | 12 |
JONES | 가 | 나 | 가 | 나 | 가 |
JONES | A6 | A7 | |||
JONES | 17 | 11 | |||
JONES | 가 | 가 | |||
CASEY | B1 | B2 | B3 | B4 | B5 |
CASEY | 8 | 3 | 4 | 4 | 0 |
CASEY | 다 | 다 | 다 | 라 | 라 |
질문입니다.
가로를 세로를 정렬하고 싶은데 5개씩을 1기준으로 위와 같은 그림으로 정렬하려고 합니다. 3ROW가 1세트입니다.
JONES | A1 | A2 | A3 | A4 | A5 |
JONES | 10 | 10 | 15 | 12 | 12 |
JONES | 가 | 나 | 가 | 나 | 가 |
첫번째 ROW에는 T_VAL1의 값이
두번째 ROW에는 T_VAL2의 값이
세번째 ROW에는 T_VAL3의 값이 조회되도록 위의 그림처럼 값이 나오면 됩니다.
고수님들의 답변 부탁드립니다
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 | WITH t_test AS ( SELECT 'JONES' t_name, 'A1' t_val1, '10' t_val2, '가' t_val3, 1 t_ord FROM dual UNION ALL SELECT 'JONES' , 'A2' , '10' , '나' , 2 FROM dual UNION ALL SELECT 'JONES' , 'A3' , '15' , '가' , 3 FROM dual UNION ALL SELECT 'JONES' , 'A4' , '12' , '나' , 4 FROM dual UNION ALL SELECT 'JONES' , 'A5' , '12' , '가' , 5 FROM dual UNION ALL SELECT 'JONES' , 'A6' , '17' , '가' , 6 FROM dual UNION ALL SELECT 'JONES' , 'A7' , '11' , '가' , 7 FROM dual UNION ALL SELECT 'CASEY' , 'B1' , '8' , '다' , 11 FROM dual UNION ALL SELECT 'CASEY' , 'B2' , '3' , '다' , 12 FROM dual UNION ALL SELECT 'CASEY' , 'B3' , '4' , '다' , 13 FROM dual UNION ALL SELECT 'CASEY' , 'B4' , '4' , '라' , 14 FROM dual UNION ALL SELECT 'CASEY' , 'B5' , '0' , '라' , 15 FROM dual ) SELECT * FROM ( SELECT t_name , t_val1, t_val2, t_val3 , CEIL(ROW_NUMBER() OVER(PARTITION BY t_name ORDER BY t_ord) / 5) y , MOD( ROW_NUMBER() OVER(PARTITION BY t_name ORDER BY t_ord) - 1, 5) + 1 x FROM t_test ) UNPIVOT (v FOR z IN (t_val1, t_val2, t_val3)) PIVOT ( MIN (v) FOR x IN (1, 2, 3, 4, 5)) ORDER BY t_name, y, z ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | SELECT t_name , y, z , MIN (DECODE(x, 1, v)) c1 , MIN (DECODE(x, 2, v)) c2 , MIN (DECODE(x, 3, v)) c3 , MIN (DECODE(x, 4, v)) c4 , MIN (DECODE(x, 5, v)) c5 FROM ( SELECT t_name , MOD(rn - 1, 5) + 1 x , CEIL(rn / 5) y , z , DECODE(z, 1, t_val1, 2, t_val2, 3, t_val3) v FROM ( SELECT t_name , t_val1, t_val2, t_val3 , ROW_NUMBER() OVER(PARTITION BY t_name ORDER BY t_ord) rn FROM t_test ) , ( SELECT LEVEL z FROM dual CONNECT BY LEVEL <= 3) ) GROUP BY t_name, y, z ORDER BY t_name, y, z ; |