2013년 10월 4일 금요일

[ORACLESQL강좌,오라클SQL가로출력, 오라클 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 개의 행이 선택되었습니다. [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=209 오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터 (오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의) www.onjprogramming.co.kr [개강안내]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr) [주말] [10/5]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 [10/5]SQL초보에서실전전문가까지 [평일야간] [10/4]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 [10/4]SQL초보에서실전전문가까지 [평일주간] [10/8]스프링3.X게시판&오라클힌트,SQL튜닝,사례연구 [10/4]PL/SQL,오라클힌트,SQL튜닝,사례연구 JAVA ORACLE iPhone/Android .NET 표준웹/HTML5 채용/취업무료교육 초보자(재학생)코스 PL/SQL,오라클힌트,SQL튜닝,사례연구 총 4일 32시간 10-04 스프링3.X게시판&오라클힌트,SQL튜닝,사례연구 총 4일 32시간 10-08 SQL초보에서실전전문가까지 총 8일 56시간 10-10 SQL초보에서실전전문가까지 총 18일 54시간 10-04 스프링3.X게시판&오라클힌트,SQL튜닝,사례연구 총 11일 33시간 10-08 오라클 마스터 총 18일 54시간 10-10 PL/SQL,오라클힌트,SQL튜닝,사례연구 총 10일 30시간 10-10 오라클 마스터 총 8일 56시간 10-05 SQL초보에서실전전문가까지 총 8일 56시간 10-05 스프링3.X게시판&오라클힌트,SQL튜닝,사례연구 총 4일 32시간 10-05 PL/SQL,오라클힌트,SQL튜닝,사례연구 총 4일 32시간 10-05

[ORACLESQL강좌,오라클SQL가로출력, 오라클 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 개의 행이 선택되었습니다. 

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터
(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  



댓글 없음:

댓글 쓰기