오라클 SQL 하나의 테이블 값을 가로로 두 번 표시.[오라클학원/오라클교육/ORACLE교육/ORACLE강좌]
아래 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 개의 행이 선택되었습니다.
댓글 없음:
댓글 쓰기