2013년 10월 23일 수요일

[ORACLE 강좌 SQL]오라클 SQL 하나의 테이블 값을 가로로 두 번 표시하는 방법

[ORACLE 강좌 SQL]오라클 SQL 하나의 테이블 값을 가로로 두 번 표시하는 방법

 아래 EMP TABLE의 원본 데이터가 있다고 할 때

SQL> select empno, ename from emp;

    EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER

14 개의 행이 선택되었습니다.


위 원본 데이터를 다음과 같이 한 테이블의 값을 가로로 두 번 표시하고자 하는 경우...


ORD      EMPNO ENAME      JOB            EMPNO ENAME      JOB
----- ---------- ---------- --------- ---------- ---------- ---------
    1      7369 SMITH      CLERK          7499 ALLEN      SALESMAN
    2      7521 WARD      SALESMAN        7566 JONES      MANAGER
    3      7654 MARTIN    SALESMAN        7698 BLAKE      MANAGER
    4      7782 CLARK      MANAGER        7788 SCOTT      ANALYST
    5      7839 KING      PRESIDENT      7844 TURNER    SALESMAN
    6      7876 ADAMS      CLERK          7900 JAMES      CLERK
    7      7902 FORD      ANALYST        7934 MILLER    CLERK.



STEP 1 : 우선 ROWNUM을 짝수, 홀수로 구분하여 가로로 표시한다.


SQL> SELECT ROWNUM,TRUNC((ROWNUM+1)/2) AS ORD,
  2            DECODE(MOD(ROWNUM,2),1,EMPNO,NULL) AS FIRST_EMPNO,
  3            DECODE(MOD(ROWNUM,2),0,EMPNO,NULL) AS SECOND_EMPNO
  4      FROM  EMP;

    ROWNUM        ORD FIRST_EMPNO SECOND_EMPNO
---------- ---------- ----------- ------------
        1          1        7369
        2          1                    7499
        3          2        7521
        4          2                    7566
        5          3        7654
        6          3                    7698
        7          4        7782
        8          4                    7788
        9          5        7839
        10          5                    7844
        11          6        7876
        12          6                    7900
        13          7        7902
        14          7                    7934

14 개의 행이 선택되었습니다.

STEP 2 : 빈 컬럼을 없애기 위해 SUM(DECODE...) 를 사용한다.

SQL>  SELECT TRUNC((ROWNUM+1)/2) AS ORD,
  2              SUM(DECODE(MOD(ROWNUM,2),1,EMPNO,NULL)) AS FIRST_EMPNO,
  3              SUM(DECODE(MOD(ROWNUM,2),0,EMPNO,NULL)) AS SECOND_EMPNO
  4      FROM  EMP
  5      GROUP BY TRUNC((ROWNUM+1)/2);

      ORD FIRST_EMPNO SECOND_EMPNO
---------- ----------- ------------
        1        7369        7499
        2        7521        7566
        3        7654        7698
        4        7782        7788
        5        7839        7844
        6        7876        7900
        7        7902        7934

7 개의 행이 선택되었습니다.

STEP 3 : 해당 EMPNO 컬럼에 ENAME, JOB 데이터를 덧붙인다.

SQL> SELECT ORD,
  2        F_EMPNO AS EMPNO,A.ENAME,A.JOB,
  3        S_EMPNO AS EMPNO,B.ENAME,B.JOB
  4  FROM  ( SELECT ORD,
  5                  SUM(FIRST_EMPNO)  AS F_EMPNO,
  6                  SUM(SECOND_EMPNO) AS S_EMPNO
  7          FROM  ( SELECT TRUNC((ROWNUM+1)/2) AS ORD,
  8                          DECODE(MOD(ROWNUM,2),1,EMPNO,NULL) AS FIRST_EMPNO,
  9                          DECODE(MOD(ROWNUM,2),0,EMPNO,NULL) AS SECOND_EMPNO
 10                    FROM EMP)
 11          GROUP BY ORD ), EMP A, EMP B
 12  WHERE  F_EMPNO = A.EMPNO
 13  AND    S_EMPNO = B.EMPNO(+)
 14  ORDER BY ORD ;

OUTER 조인을 사용하지 않으면 SECOND_EMPNO 컬럼의 값이 NULL인 경우 전체 로우의 값이 나오지 않게 되므로 반드시 S_EMPNO와 조인되는 B.EMPNO 컬럼에 (+) 사인을 추가해야 한다.

ORD      EMPNO ENAME      JOB            EMPNO ENAME      JOB
---- ---------- ---------- --------- ---------- ---------- ---------
  1      7369 SMITH      CLERK          7499 ALLEN      SALESMAN
  2      7521 WARD      SALESMAN        7566 JONES      MANAGER
  3      7654 MARTIN    SALESMAN        7698 BLAKE      MANAGER
  4      7782 CLARK      MANAGER        7788 SCOTT      ANALYST
  5      7839 KING      PRESIDENT      7844 TURNER    SALESMAN
  6      7876 ADAMS      CLERK          7900 JAMES      CLERK
  7      7902 FORD      ANALYST        7934 MILLER    CLERK

7 개의 행이 선택되었습니다. 

댓글 없음:

댓글 쓰기