GROUP BY 질문 드립니다. 0 2 673

by 어쩌다보니 [Oracle 기초] [2020.12.21 20:27:39]


카테고리1 카테고리2 카테고리3 카테고리4
단편소설 저자 홍길동,임걲정,어우동,아무개
단편소설 출판사 동아출판사,해금,빛나 
단편소설 옮긴이 이순신,김유신,강감찬,세종대왕
단편소설 차례 새로운시작, 중간, 끝, 등등
추리소설 저자 비, 김태희, 유재석, 김종국
추리소설 출판사 한국출판사, 지구촌, 민음사
추리소설 옮긴이 신사임당, 이이, 이황
추리소설 차례 처음 ,중간, 끝 
추리소설 기타 참고사항, 표지크기, 책크기 등등

안녕하세요.  주위에 물어볼 사람도 없고 혼자여서 오라클 클럽분들의 도움을 요청합니다.

위와같은 데이터가 있습니다. 

카테고리4 는 WM_CONCAT 여러컬럼  이용해서 데이터 여러개를 하나로 합친겁니다. 

나머진 조인걸고 GROUP BY로 묶은겁니다. 

여기서 위에 데이터를 아래처럼 카테고리1 과 2를 종류별로 한번씩만 나오게 하고 싶습니다.

어떻게 해야 할까요??

 

카테고리1 카테고리2 카테고리3 카테고리4
단편소설 저자 홍길동,임걲정,어우동,아무개
    출판사 동아출판사,해금,빛나 
    옮긴이 이순신,김유신,강감찬,세종대왕
    차례 새로운시작, 중간, 끝, 등등
  추리소설 저자 비, 김태희, 유재석, 김종국
    출판사 한국출판사, 지구촌, 민음사
    옮긴이 신사임당, 이이, 이황
    차례 처음 ,중간, 끝 
    기타 참고사항, 표지크기, 책크기 등등
by 춘 [2020.12.21 21:30:54]
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
    )
;

 


by 마농 [2020.12.22 12:42:12]

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
;

 

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