상세 컨텐츠

본문 제목

column을 row로, column-to-row pivot 쿼리

DataBase/Oracle

by 탑~! 2012. 5. 31. 10:15

본문

출처 : http://blog.naver.com/tyboss/70009661021

우리가 많이 알고 있는 pivot 쿼리는 주로 row 형태를 column의 형태로 바꾸는, 굳이 이름을 붙이자면 row-to-column 쿼리이다.
여기에서는 반대로 column-to-row pivot 쿼리를 만들어 본다.

아래 scott.dept 테이블이 있다.

10  ACCOUNTING  NEW YORK
20  RESEARCH    DALLAS
30  SALES       CHICAGO
40  OPERATIONS  BOSTON

이것을 아래 형태로 바꾸는 것이다.

10
ACCOUNTING
NEW YORK
20
RESEARCH
DALLAS
30
SALES
CHICAGO
40
OPERATIONS
BOSTON


쿼리는 아래와 같다.
오라클 버전에 따라 정렬을 다시 해줘야 할 수도 있다.


SELECT DECODE (MOD (ROWNUM - 1, 3) + 1, 1, TO_CHAR (deptno), 2, dname, 3, loc)
  FROM (SELECT     1
              FROM DUAL
        CONNECT BY LEVEL <= 3), dept




위의 결과를 약간 더 응용해 보자.

scott.emp 테이블을 아래와 같이 쿼리하면,

SELECT ename ename1, empno empno1, job ename2, mgr empno2
  FROM emp

결과는 아래와 같다.

ENAME1    EMPNO1    ENAME2    EMPNO2
SMITH      7,369    CLERK      7,902
ALLEN      7,499    SALESMAN   7,698
WARD       7,521    SALESMAN   7,698
JONES      7,566    MANAGER    7,839
MARTIN     7,654    SALESMAN   7,698
BLAKE      7,698    MANAGER    7,839
CLARK      7,782    MANAGER    7,839
SCOTT      7,788    ANALYST    7,566
KING       7,839    PRESIDENT    
TURNER     7,844    SALESMAN   7,698
ADAMS      7,876    CLERK      7,788
JAMES      7,900    CLERK      7,698
FORD       7,902    ANALYST    7,566
MILLER     7,934    CLERK      7,782


이것을 아래와 같이 두개의 컬럼씩 번갈아서 나오도록 해보자.

ENAME     EMPNO
SMITH     7,369
CLERK     7,902
ALLEN     7,499
SALESMAN  7,698
WARD      7,521
SALESMAN  7,698
JONES     7,566
MANAGER   7,839
MARTIN    7,654
SALESMAN  7,698
BLAKE     7,698
MANAGER   7,839
CLARK     7,782
.......
.......
.......

쿼리는 아래와 같다.

SELECT DECODE (MOD (ROWNUM - 1, 2) + 1, 1, ename, 2, job) ename,
       DECODE (MOD (ROWNUM - 1, 2) + 1, 1, empno, 2, mgr) empno
  FROM (SELECT     1
              FROM DUAL
        CONNECT BY LEVEL <= 2), emp


나름대로 응용해 본 예제는 아래 페이지에서 찾을 수 있다.

http://www.orafaq.com/forum/t/58454/78939/




* 글쓴이 : 김홍선
* 위 내용을 이 곳에서 처음 보신분은 다른 곳에 게재하실 때 반드시 출처를 밝혀주시기 바랍니다.
* 위 내용에 관해서 잘못된 부분이 있거나 질문이 있으신 분은 답글로 알려주시기 바랍니다.

RE: column을 row로, column-to-row pivot 쿼리 (Posted: 2006-08-31 12:01:59.0)    새창으로
by 엑셥 (Posts: 24 - Registered: 2006-08-29 09:21:32.0)
안녕하세요. 김홍선님. 오늘도 SQL Query Tips에서 유용한 정보 많이 얻어갑니다.

다름이 아니라, column-to-row pivot을 보고 있는데요.
이곳에서 제시하신 

SELECT DECODE (MOD (ROWNUM - 1, 3) + 1, 1, TO_CHAR (deptno), 2, dname, 3, loc)
  FROM (SELECT     1
              FROM DUAL
        CONNECT BY LEVEL <= 3), dept

쿼리로 하면, 즉 ROWNUM으로 레코드를 접근하면 (10, ACCOUNTING, NEW YORK)
이 아니라 (10, RESEARCH, CHICAGO)로 결과가 나오거든요.
아마 ROWNUM을 MOD 3으로 해서 그런거 같습니다.

그래서 이 방법보다는 매칭되는 레코드를 그룹화해서 인라인뷰에 넣고 이를
DECODE해야할 것 같습니다.

제가 한 방법은 아래와 같습니다.

SELECT DECODE(CNT, 1, TO_CHAR(DEPTNO), 2, DNAME, 3, LOC)
FROM   (SELECT DEPTNO
             , DNAME
             , LOC
             , ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY DEPTNO) CNT
        FROM   DEPT
             , (SELECT *
                FROM   DUAL
                CONNECT BY LEVEL <= 3)) 

혹시 제가 리플단 내용중에 이상한점이 보이시면 리플 부탁드립니다. 
오늘 하루도 행복하세요 ^^

RE: column을 row로, column-to-row pivot 쿼리 (Posted: 2006-08-31 12:41:48.0) 

by 김홍선 (Posts: 448 - Registered: 2006-04-15 11:37:13.0)
좋은 방법입니다.
그리고 아래와 같이 하셔도 버전에 관계없이 원하는 결과를 얻으실 수 있겠죠.


SELECT   DECODE (level#, 1, TO_CHAR (deptno), 2, dname, 3, loc)
    FROM dept
       , (SELECT     LEVEL level#
                FROM DUAL
          CONNECT BY LEVEL <= 3)
ORDER BY deptno
       , level#

'DataBase > Oracle' 카테고리의 다른 글

SYS, SYSTEM 비번을 잃어버렸을때  (0) 2012.05.31
오라클 유용한 함수 정리  (0) 2012.05.31
가상 Row 만들기  (0) 2012.05.31
Oracle 중요 힌트 Hint  (0) 2012.05.31
오라클 정규식 치환 regexp_replace  (0) 2012.05.31

관련글 더보기