쿼리 PIVOT 질문입니다 0 4 1,061

by 후인구 [2018.05.25 01:50:16]


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의 값이 조회되도록 위의 그림처럼 값이 나오면 됩니다.

 

고수님들의 답변 부탁드립니다

by 마농 [2018.05.25 08:44:04]
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
;

 


by 후인구 [2018.05.25 09:16:57]

답변 감사합니다. 버전이 oracle  10g입니다. Pivot 안하고 답변도 부탁드립니다.


by 마농 [2018.05.25 09:34:41]
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
;

 


by 후인구 [2018.05.25 11:19:41]

감사합니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입