데이터
항목번호 항목명 이름 별명
1 a 홍길동 홍홍
2 b 이순신 대장군
1 a 김태희 여신
2 b 수지 이민호
1 a 김성령 아줌마
2 b 강남 강남
예를 들어 위 데이터를 아래와 같이 표현하고싶습니다.
1 a 홍길동 홍홍 김태희 여신 김성령 아줌마
2 b 이순신 대장군 수지 이민호 강남 강남
수정)위 이름,별명, 이름, 별명은 각각 하나의 컬럼으로 나와야 해요..
여러가지 시도를 하다가.
ROW_NUMBER() OVER (PARTITION BY .. ORDER BY ..)를 사용했는데
다른 방법이 혹시 있을까요???
도움좀 부타그리겠습니다..
PIVOT 함수를 이용한 X-Y 변경 강좌 : http://www.gurubee.net/lecture/2214
WITH T (항목번호, 항목명, 이름, 별명) AS ( SELECT 1 , 'A' , '홍길동' , '홍홍' FROM DUAL UNION ALL SELECT 2 , 'B' , '이순신' , '대장군' FROM DUAL UNION ALL SELECT 1 , 'A' , '김태희' , '여신' FROM DUAL UNION ALL SELECT 2 , 'B' , '수지' , '이민호' FROM DUAL UNION ALL SELECT 1 , 'A' , '김성령' , '아줌마' FROM DUAL UNION ALL SELECT 2 , 'B' , '강남' , '강남' FROM DUAL ) SELECT 항목번호 , 항목명 , MAX(이름_1) NAME01 , MAX(별명_1) NICK01 , MAX(이름_2) NAME02 , MAX(별명_2) NICK02 , MAX(이름_3) NAME03 , MAX(별명_3) NICK03 FROM (SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY 항목번호 ORDER BY 항목번호) NUM1 , ROW_NUMBER() OVER(PARTITION BY 항목번호 ORDER BY 항목번호) + 1000 NUM2 , 항목번호 , 항목명 , 이름 , 별명 FROM T ) PIVOT(MAX(이름) FOR NUM1 IN (1 이름_1, 2 이름_2, 3 이름_3) ) PIVOT(MAX(별명) FOR NUM2 IN (1001 별명_1, 1002 별명_2, 1003 별명_3) ) ) AA GROUP BY 항목번호, 항목명 ;
WITH t AS ( -- 순서(seq) 항목을 추가했습니다. SELECT 1 cd, 'a' nm, 1 seq, '홍길동' nm1, '홍홍' nm2 FROM dual UNION ALL SELECT 2, 'b', 1, '이순신', '대장군' FROM dual UNION ALL SELECT 1, 'a', 2, '김태희', '여신' FROM dual UNION ALL SELECT 2, 'b', 2, '수지' , '이민호' FROM dual UNION ALL SELECT 1, 'a', 3, '김성령', '아줌마' FROM dual UNION ALL SELECT 2, 'b', 3, '강남' , '강남' FROM dual ) SELECT cd, nm , MIN(DECODE(rn, 1, nm1)) nm1_1 , MIN(DECODE(rn, 1, nm2)) nm2_1 , MIN(DECODE(rn, 2, nm1)) nm1_2 , MIN(DECODE(rn, 2, nm2)) nm2_2 , MIN(DECODE(rn, 3, nm1)) nm1_3 , MIN(DECODE(rn, 3, nm2)) nm2_3 FROM (SELECT cd, nm, nm1, nm2 , ROW_NUMBER() OVER(PARTITION BY cd ORDER BY seq) rn FROM t ) GROUP BY cd, nm ORDER BY cd ;