오라클 Oracle column 값을 분산하기


 각각한 단일한 column 값들을 같은 의미를 가지는 몇 개의 column으로 분산하여 나열하고 싶을 때,

 

SELECT OBJ#,
  NAME
FROM SYS.COL$
WHERE OBJ# IN (16, 20)
  AND COL# < 6
ORDER BY OBJ#; 

 

 OBJ#

 NAME

 16

 TS#

 16

 NAME

 16

 OWNER#

 16

 ONLINE$

 16

 CONTENTS$

 20

 OBJ#

 20

 BO#

 20

 COL#

 20

 POS#

 20

 SEGCOL#

 

 이 테이블 조회 값을 가로로 2번 나열하는 형태를 만들어 보겠습니다.

 

 우선 Rownum 값과 그걸 2로 나눈 나머지 값을 추가하겠습니다.

 

 

 SELECT (ROWNUM - 1) RNUM,
   MOD(ROWNUM - 1,
2) MNUM,
   OBJ#,
   NAME
 FROM (
    SELECT OBJ#,
      NAME
    FROM SYS.COL$
    WHERE OBJ# IN (16, 20)
      AND COL# < 6
    ORDER BY OBJ#);

-- 붉은 색의 숫자가 반복하고 싶은 만큼의 숫자임

 

 

 RNUM

 MNUM

 OBJ#

 NAME

 0

 0

 16

 TS#

 1

 1

 16

 NAME

 2

 0

 16

 OWNER#

 3

 1

 16

 ONLINE$

 4

 0

 16

 CONTENTS$

 5

 1

 20

 OBJ#

 6

 0

 20

 BO#

 7

 1

 20

 COL#

 8

 0

 20

 POS#

 9

 1

 20

 SEGCOL#

 

 여기에 나머지 값을 기준으로 옆으로 펼치도록 합니다.

 

 

 SELECT MAX(DECODE(MNUM, 0, OBJ#)) OBJ_1,
   MAX(DECODE(MNUM, 0, RNUM)) RNUM_1,
   MAX(DECODE(MNUM, 0, NAME)) NAME_1,
   MAX(DECODE(MNUM, 1, OBJ#)) OBJ_2,
   MAX(DECODE(MNUM, 1, RNUM)) RNUM_2,
   MAX(DECODE(MNUM, 1, NAME)) NAME_2

   -- 여기에 옆으로 펼치고 싶은 만큼 반복한다.
 FROM (
    SELECT (ROWNUM - 1) RNUM,
      MOD(ROWNUM - 1, 2) MNUM,
      OBJ#,
      NAME
    FROM (
        SELECT OBJ#,
          NAME
        FROM SYS.COL$
        WHERE OBJ# IN (16, 20)
          AND COL# < 6
        ORDER BY OBJ#))
 GROUP BY TRUNC(RNUM / 2)
 ORDER BY OBJ_1, RNUM_1

 -- 붉은 색의 숫자가 반복하고 싶은 만큼의 숫자임

 

 

 

Posted by 쭈니루
TAG

댓글을 달아 주세요