메뉴 건너뛰기

tnt_db

Oracle 소계/합계 함께 보기

운영자 2002.09.18 14:24 조회 수 : 3134 추천:18

소계/합계 함께 보기
    
조건.
    TEST12 에는 다음과 같은 DATA가 있다.    

    PRESS         BOOK_TYPE     BOOK_NAME                PRICE
    ------------- ------------- -------------------- ---------
    서울 출판사   소설          전원일기                  9000
    서울 출판사   소설          인간시대                  8000
    서울 출판사   소설          태백산                   10000
    서울 출판사   소설          손자병법                  7000
    서울 출판사   시            접시꽃당신                6000
    서울 출판사   시            진다래꽃                  7000
    서울 출판사   시            윤동주시집                7000
    서울 출판사   시            겨울비                    7000
    서울 출판사   수필          낙엽을태우며              7000
    서울 출판사   수필          가을이오면                7000
    서울 출판사   수필          어떻게사나                7000
    서울 출판사   수필          비오면나는님을그린다      7000
    한국출판      교과서        고교국어                  9000
    한국출판      교과서        중학수학                  8000
    한국출판      교과서        고교수학                 10000
    한국출판      교과서        고교물리                  7000
    한국출판      교과서        지구과학                  6000
    한국출판      교과서        물리                      7000
    한국출판      교과서        고전                      7000
    한국출판      참고서        영어참고                  7000
    한국출판      참고서        수학참고                  7000
    한국출판      참고서        국어참고                  7000
    한국출판      참고서        물리참고                  7000
    한국출판      참고서        전과                      7000  
      
문제.
    동일한 DATA를 읽어오되,BOOK_TYPE 별 소계,출판사별 소계,
    전체 합계를 보고싶다.
    결과물이 다음과 같으면된다.

    출 판 사         종    류  책    명             가    격
    --------------   --------- ------------------   --------
    서울 출판사      소설      손자병법                 7000
    서울 출판사      소설      인간시대                 8000
    서울 출판사      소설      전원일기                 9000
    서울 출판사      소설      태백산                  10000
    서울 출판사      소설 계                           34000
    서울 출판사      수필      가을이오면               7000
    서울 출판사      수필      낙엽을태우며             7000
    서울 출판사      수필      비오면나는님을그린다     7000
    서울 출판사      수필      어떻게사나               7000
    서울 출판사      수필 계                           28000
    서울 출판사      시        겨울비                   7000
    서울 출판사      시        윤동주시집               7000
    서울 출판사      시        접시꽃당신               6000
    서울 출판사      시        진다래꽃                 7000
    서울 출판사      시 계                             27000
    서울 출판사 계                                     89000
    한국출판         교과서    고교국어                 9000
    한국출판         교과서    고교물리                 7000
    한국출판         교과서    고교수학                10000
    한국출판         교과서    고전                     7000
    한국출판         교과서    물리                     7000
    한국출판         교과서    중학수학                 8000
    한국출판         교과서    지구과학                 6000
    한국출판         교과서 계                         54000
    한국출판         참고서    국어참고                 7000
    한국출판         참고서    물리참고                 7000
    한국출판         참고서    수학참고                 7000
    한국출판         참고서    영어참고                 7000
    한국출판         참고서    전과                     7000
    한국출판         참고서 계                         35000
    한국출판 계                                        89000
    합 계                                      178000  
  
생각.
    많이 알려져 있는 방법이다.
    여기서는 그 사용 방법 및 원리를 다시한번 익히고 지나가자.  
    엿보기1.몇번의 DATA READ 가 필요한지 살펴보자.
            첫번째 원래 DATA ,두번째 출판사/종류별 계,
            세번째 출판사별 계,네번째 합 계,
            이렇게 네번의 READ를 통해 원하는 DATA를 가져다
            가공하고 원하는 순서대로 배열하면 된다.
    엿보기2.네번의 SELECT 를 통해 원하는 단위별로 GROUPING을 하고
            원하는 순서대로 배열할 수 있다면
            한번 읽은 DATA를 네번의 복제를 통해 GROUPING  하고
            원하는 순서대로 배열할 수 있을 것이다.
    엿보기3.먼저 출판사(첫번째단계)부터 생각해보자.
            합계를 보여주고 싶은 GROUP에서는 '합 계',
            출판사별 계를 보여주고싶은 단위에서는 출판사명 || '계',
            나머지 경우는 단순히 출판사명 만을 기준으로 GROUP BY 가
            일어나면 된다.
    엿보기4.다음 책종류(두번째단계)는 어떤가.
            출판사/책종류별 GROUP에서는 책종류 || '계',
            원DATA에서는 단순한 책종류가 GROUP BY 단위가 되며,
            나머지(합계,출판사계)는 이미 첫번째 단계를 통해
            GROUPING을 끝냈다.
    엿보기5.마지막으로 책명칭(세번째단계)은 어떤가?..
            이미 모든 계는 앞단계까지에서 GROUP BY 단위를 결정했고,
            이번 단계에서는 원DATA에 책이름을 보여주는데 의미가 있다.
            이렇게 GROUP 단위를 지정하고 GROUP BY 하여 SUM만
           해주면된다.
해법.
    엿보기에 나온 그대로를 SQL문으로 바꿔주면 된다.
    더이상의 답은 없다.
    우선 FROM 절을 먼저 살펴보면 원 TABLE을 4번복제하기위하여
    다음과 같이 돨 것이다.

    FROM   TEST12 A,
          (SELECT ROWNUM RCNT
           FROM TEST12
           WHERE ROWNUM < 5
          ) B

    단계1.출판사(첫번째단계)는 어떻게 구성되겠는가.
          4개의 복제DATA중 2를 합계용으로 3을 출판사소계용으로
          가공하고자 한다면 다음과 같이 될것이다.
          DECODE(RCNT,2,'합 계',3,PRESS||' 계',PRESS) "출 판 사"
    단계2.책종류(두번째단계)에서는 출판사/종류별 계로 사용할
          복제번호와 원본DATA로 사용할 복제번호를 결정해줘야 한다.
          각각 1과4로 결정한다면 두번째 GROUP BY 단위는
          다음과 같이 될것이다.
          DECODE(RCNT,1,BOOK_TYPE||' 계',4,BOOK_TYPE) "종    류"
    단계3.책명칭(세번째단계)는 간단하다.
          DECODE(RCNT,4,BOOK_NAME)     "책    명"

  
    이제 할 일이 무엇이 있는가?..
    연결만하면 된다.
    
    SELECT DECODE(RCNT,2,'합 계',3,PRESS||' 계',PRESS) "출 판 사",
           DECODE(RCNT,1,BOOK_TYPE||' 계',4,BOOK_TYPE) "종    류",
           DECODE(RCNT,4,BOOK_NAME)     "책    명",
           SUM(PRICE)    "가    격"
    FROM   TEST12 A,
          (SELECT ROWNUM RCNT
           FROM TEST12
           WHERE ROWNUM < 5
          ) B
    GROUP BY
           DECODE(RCNT,2,'합 계',3,PRESS||' 계',PRESS),
           DECODE(RCNT,1,BOOK_TYPE||' 계',4,BOOK_TYPE),
           DECODE(RCNT,4,BOOK_NAME)
    이게 답이다.
뒷풀이.
    여기서는 "합계"가 한글 순서상 다행하게도 제일 뒤에 오는 경우이다.
    하지만 출판사중에 '항구출판' 같이 합계보다 순서상 뒤에 위치하게
    되면 어쩌나..또는 합계 대신 '계' 만을 쓰고 싶다면 어쩔것인가.

    간단하다.
    SELECT 첫번째 GROUP BY 단위를 다음처럼 쓰면된다.

    DECODE(RCNT,2,1,0)
    합계는 1을 갖고 나머지는 0을 가지므로 순서대로 정렬이 일어나
    답이 나올 것이다.
위로