카테고리1 | 카테고리2 | 카테고리3 | 카테고리4 |
책 | 단편소설 | 저자 | 홍길동,임걲정,어우동,아무개 |
책 | 단편소설 | 출판사 | 동아출판사,해금,빛나 |
책 | 단편소설 | 옮긴이 | 이순신,김유신,강감찬,세종대왕 |
책 | 단편소설 | 차례 | 새로운시작, 중간, 끝, 등등 |
책 | 추리소설 | 저자 | 비, 김태희, 유재석, 김종국 |
책 | 추리소설 | 출판사 | 한국출판사, 지구촌, 민음사 |
책 | 추리소설 | 옮긴이 | 신사임당, 이이, 이황 |
책 | 추리소설 | 차례 | 처음 ,중간, 끝 |
책 | 추리소설 | 기타 | 참고사항, 표지크기, 책크기 등등 |
안녕하세요. 주위에 물어볼 사람도 없고 혼자여서 오라클 클럽분들의 도움을 요청합니다.
위와같은 데이터가 있습니다.
카테고리4 는 WM_CONCAT 여러컬럼 이용해서 데이터 여러개를 하나로 합친겁니다.
나머진 조인걸고 GROUP BY로 묶은겁니다.
여기서 위에 데이터를 아래처럼 카테고리1 과 2를 종류별로 한번씩만 나오게 하고 싶습니다.
어떻게 해야 할까요??
카테고리1 | 카테고리2 | 카테고리3 | 카테고리4 |
책 | 단편소설 | 저자 | 홍길동,임걲정,어우동,아무개 |
출판사 | 동아출판사,해금,빛나 | ||
옮긴이 | 이순신,김유신,강감찬,세종대왕 | ||
차례 | 새로운시작, 중간, 끝, 등등 | ||
추리소설 | 저자 | 비, 김태희, 유재석, 김종국 | |
출판사 | 한국출판사, 지구촌, 민음사 | ||
옮긴이 | 신사임당, 이이, 이황 | ||
차례 | 처음 ,중간, 끝 | ||
기타 | 참고사항, 표지크기, 책크기 등등 |
WITH t AS ( SELECT '책' category, '단편소설' category2, '저자' category3, '홍길동,임꺽정,어우동,아무개' category4 FROM dual UNION ALL SELECT '책', '단편소설', '출판사', '동아출판사,해금,빛나' FROM dual UNION ALL SELECT '책', '단편소설', '옮긴이', '이순신,김유신,강감찬,세종대왕' FROM dual UNION ALL SELECT '책', '단편소설', '차례', '새로운시작, 중간, 끝, 등등' FROM dual UNION ALL SELECT '책', '추리소설', '저자', '비, 김태희, 유재석, 김종국' FROM dual UNION ALL SELECT '책', '추리소설', '출판사', '한국출판사, 지구촌, 민음사' FROM dual UNION ALL SELECT '책', '추리소설', '옮긴이', '신사임당, 이이, 이황' FROM dual UNION ALL SELECT '책', '추리소설', '차례', '처음 ,중간, 끝' FROM dual UNION ALL SELECT '책', '추리소설', '기타', '참고사항, 표지크기, 책크기 등등' FROM dual ) SELECT (CASE WHEN category_rnum = 1 THEN category ELSE '' END) AS category , (CASE WHEN category_rnum2 = 1 THEN category2 ELSE '' END) AS category2 , category3 , category4 FROM ( SELECT category , category2 , category3 , category4 , ROW_NUMBER() OVER (PARTITION BY category ORDER BY 1) AS category_rnum , ROW_NUMBER() OVER (PARTITION BY category, category2 ORDER BY 2) AS category_rnum2 FROM t ) ;
WM_CONCAT 은 비공식 함수 입니다.
11G 이상이라면? LISTAGG 를 사용하세요.
http://gurubee.net/article/55512
SELECT DECODE(ROW_NUMBER() OVER(PARTITION BY c1 ORDER BY c2, c3), 1, c1) c1 , DECODE(ROW_NUMBER() OVER(PARTITION BY c1, c2 ORDER BY c3), 1, c2) c2 , c3 , LISTAGG(c4, ',') WITHIN GROUP(ORDER BY 1) c4 FROM t GROUP BY c1, c2, c3 ;