메뉴 건너뛰기

tnt_db

Oracle COLUMN을 ROW로

운영자 2002.09.18 14:23 조회 수 : 5858 추천:9

Column을 Row로

조건.
    TABLE : TEST11

    KEY1     KEY2                  FRE       SUP       JUN       SEN
    -------- --------------- --------- --------- --------- ---------
    공과대학 항공우주공학과        120       140       140       120
    공과대학 기계공학과            240       260       240       240
    공과대학 조선공학과            118       138       136       126
    공과대학 산업공학과            123       141       140       120
    공과대학 전자공학과            126       141       140       128
    공과대학 재료공학과            128       132       142       126
    공과대학 화학공학과            122       141       141       122
    공과대학 전기공학과            120       140       140       120
    공과대학 컴퓨터공학과          124       145       142       121
    공과대학 섬유공학과            126       144       140       120
    공과대학 자동화공학과          122       142       144       125
    공과대학 고분자공학과          121       142       143       124

문제.
    TEST11에 있는 DATA가 위와같이 각 학년별 인원수를 보관하고 있다.
    문제는 대학별/학과별/학년별 인원수로 보고싶다.
    다음과 같이..

    -------- --------------- ----- ------------------------------
    공과대학 고분자공학과    1학년                            121
    공과대학 고분자공학과    2학년                            142
    공과대학 고분자공학과    3학년                            143
    공과대학 고분자공학과    4학년                            124
    공과대학 기계공학과      1학년                            240
    공과대학 기계공학과      2학년                            260
    공과대학 기계공학과      3학년                            240
    공과대학 기계공학과      4학년                            240
    공과대학 산업공학과      1학년                            123
    공과대학 산업공학과      2학년                            141
    공과대학 산업공학과      3학년                            140
    공과대학 산업공학과      4학년                            120
    공과대학 섬유공학과      1학년                            126
    공과대학 섬유공학과      2학년                            144
    공과대학 섬유공학과      3학년                            140
    공과대학 섬유공학과      4학년                            120
    공과대학 자동화공학과    1학년                            122
    공과대학 자동화공학과    2학년                            142
    공과대학 자동화공학과    3학년                            144
    공과대학 자동화공학과    4학년                            125

    점점점.....

생각.
    COLUMN 에 보관된 정보를 ROW 형식으로 전환해서 보고자하는 경우가
    흔히 발생한다.
    어떻게 하면 DATA를 전환시킬 수 있을지 잠시 생각을 해보자.
    엿보기.위와같은 경우는 4개의 COLUMN을 4개의 ROW로 바꿔야한다.
           결국 1개의 RECORD가 4개의 RECORD로 늘어나면서
           각 RECORD가 필요한 정보만 발췌해 가져야 한다.
           뭐가 필요하겠는가?.
           1개의 RECORD를 4번 읽기위한 방법을 먼저 찾아야 할 것이다.
           그 방법을 찾았으면 한번씩 읽힐때마다 1번째는 1학년 정보만,
           2번째는 2학년 정보만,3번째는 3학년 정보만,
           4번째는 4학년 정보만을 읽어올 수 있는 방법만 찾으면 문제는
           해결될듯하다.

해법.
    생각을 했으면 단계별로 문제를 해결해보자,
    단계1.먼저 1개의 RECORD정보를 4번읽는 방법으로 4개의 RECORD를
          가진 TABLE과의 JOIN을 이용 DATA를 복제하는 방법을 쓸 수
          있다.
          FROM 절이 다음처럼 되면 될 것이다.      

          FROM     TEST11,
                  (SELECT ROWNUM CNT
                   FROM   USER_TABLES
                   WHERE  ROWNUM < 5)
    단계2.KEY1과 KEY2가 UNIQUE를 보장했지만 이제는 학년 정보가
          COLUMN에서 RECORD로 내려가면서 학년정보도 UNIQUE 를
          확보하기위한 KEY가 되어야한다,
          JOIN된 후에 CNT 1과 JOIN이 된 RECORD는 1학년정보를
          가져오고,
          차례로 4는 4학년 정보를 가져온다.
          3번째 KEY를 구성하기위한 문장은 다음처럼 될 것이다.
          DECODE(CNT,1,'1학년',2,'2학년',3,'3학년',4,'4학년') KEY3
    단계3.KEY 구성이 끝났으면 학년별 인원수 정보를 가공해야한다.
          원리를 KEY3를 구성하는 방법과 같다.        
          DECODE(CNT,1,FRE,2,SUP,3,JUN,4,SEN)
    단계4.문장전체를 붙여보자

          SELECT KEY1,KEY2,
                 DECODE(CNT,1,'1학년',2,'2학년',3,'3학년',4,'4학년')
                 KEY3,
                 DECODE(CNT,1,FRE,2,SUP,3,JUN,4,SEN)
          FROM   TEST11,
                (SELECT ROWNUM CNT
                 FROM    USER_TABLES
                 WHERE ROWNUM < 5)
뒷풀이.
    간단한 방법이다.
    하지만 종종 부딪히는 문제다.
    이런경우는 설계단계에서 고려를 해주면 편하게 해결될 부분이기도
    하다.
    하지만 반대의 경우도 흔하게 있다.
    즉 ROW 형식을 COLUMN형식으로 바꿔야하는 경우이다.
    크게 문제가 되는 부분은 아니지만 주로사용되는 방법으로 설계가
    이루어지면
    형식을 전환하는 번거로움을 많이 줄일 수 있을 듯하다.

  
[Home] [About Me] [Not Easy] [Hobby] [Advanced] [Hot Issue] [Basic]  
위로