UNPIVOT 쿼리 - 가로세로변환, COLUMN 단위 자료를 ROW 단위 자료로 변환1

 

Row 로 만들고 싶은 컬럼의 수만큼 존재하는 행을 부풀린 후, DECODE 를 이용해 경우에 맞는 컬럼을 한 컬럼으로 모아 보여주는 방식이다. 

 

 

1. 

DANIEL 로 로그인한다.

 

 

 

 

SELECT * FROM TEST11; 해 보면 아래와  같이 나온다.

단대이름, 과, 1학년 학생수, 2학년 학생수, 3학년 학생수, 4학년 학생수 의 5개의 필드로 이루어져 있다. PK 는 COLL 과 DEPT 다. 

 

 

위와 같은 RESULTSET 에서 FRE, SUP,  JUN, SEN 필드를 하나의 필드(학생수 나오는 필드)로 바꾸는게 최종적으로 해야 할 일이다. 몇 학년인지 나타내는 필드(KEY3) 는 PK 였던 COLL 과 DEPT 가 ROW 가 늘어나면서 유니크하지 못하게 되므로 PK 로서 기능을 하도록, 또 의미전달을 위해 새롭게 만들어져야 한다(COLL , DEPT , KEY3 가 하나의 PK 가 되는 것 ) 아래 모습과 같아져야 한다.

 

 

- FRE, SUP,  JUN, SEN 필드에 있는 한 행의 자료가 4 개의 새로운 ROW 로 변환되어야 한다.

- 각 행에 1학년부터 4학년까지를 분리해서 한 행에 하나의 학년만 나오도록 해야 한다.

- 현재 TEST11 에는 총 12행이 있으니 위의 그림처럼 4개의 기존 컬럼이 없어지고 ROW 로 변환되어야 하므로 총 12*4 = 48 행으로 늘어나야 한다.

 

 

가장 먼저 해야 할 일은 한 개의 ROW 를 4번 읽기 위한 방법을 찾아야 한다.

현재는 1학년 학생수~4학년 학생수가 모두 한 ROW 에 나오는데 이걸 4개의 ROW 로 바꾸려면 현재 한 행을 4개의 행으로 바꿔야 하는 것.

 

그 방법만 찾는다면 한 번씩 읽힐 때마다 

첫 번째는 1학년 정보만,

두 번째는 2학년 정보만, 

세 번째는 3학년 정보만,

네 번째는 4학년 정보만 읽어 들이게 하면 된다.

 

대략 

DECODE(CNT, 1, '1학년', 2, '2학년', 3, '3학년', 4, '4학년') KEY3, <-- 이런 식의 될 것.

 

먼저 1개의 RECORD 정보를 4 번 읽게 하기 위해 4개의 레코드를 가진 테이블과 Cartesian join 을 시킨다. 조인시에 WHERE 절을 쓰지 않으면 당연히 TEST11 에 있는 한 개의 레코드마다 4개의 레코드를 가진 테이블의 각 행과 조인을 할 테니까 말야.

 

** 현재 1개의 RECORD 정보를 4 번 읽게 하기 위해 4개의 레코드를 가진 테이블과 Cartesian join 을 시킨다. 현재 1개의 RECORD 정보를 3 번 읽게 하기 위해 3개의 레코드를 가진 테이블과 Cartesian join 을 시킨다. 

 

 

아래 쿼리처럼 만든다.

 

SELECT *

    FROM TEST11,

    (

        SELECT ROWNUM CNT

            FROM USER_TABLES

            WHERE ROWNUM < 5

    )      

 

위 쿼리를 실행시키면,

TEST11 에 현재 12개의 행이 있으므로 각 행이 4개짜리 테이블과 조인하므로 

 

CNT 가 1인개 12개,

CNT 가 2인개 12개,

CNT 가 3인개 12개,

CNT 가 4인개 12개

 

총 48 개의 행이 생긴다.

아래 그림과 같다(아래 쪽은 많이 잘린 그림임)



이제 SELECT 하면 된다. 아래와 같이 한다.

위 테이블의 각 ROW 가 아래 쿼리를 거치게 되는 것.

 

 

 

SELECT  COLL, DEPT,

        DECODE(CNT, 1, '1학년', 2, '2학년', 3, '3학년', 4, '4학년') KEY3,

        DECODE(CNT, 1, FRE, 2, SUP, 3, JUN, 4, SEN)

        FROM TEST11 ,

        (

            SELECT ROWNUM CNT 

                FROM USER_TABLES

                WHERE ROWNUM < 5

        )

 

위 쿼리를 실행시키면 아래와 같이 원래 목적했던 모양대로  RESULTSET 이 나온다. 




 - TEST11 테이블을 이용해서 아래와 같은 모습을 만드려면 쿼리는 어찌되어야 할까?

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

......................... 중간 생략 ..........................



위에서 정리한 정리를 다시 보자.

 

** 현재 1개의 RECORD 정보를 4 번 읽어서 4개의 ROW 가 되게 하기 위해 4개의 레코드를 가진 테이블과 Cartesian join 을 시킨다. 현재 1개의 RECORD 정보를 3 번 읽어서 3개의 ROW 가 되게 하기 위해 3개의 레코드를 가진 테이블과 Cartesian join 을 시킨다. 

 

이 경우 FRE, SUP,  JUN, SEN  4개의 필드가 두 개의 필드 (C1, C2) 로 바뀐다. 그러니까 현재 1개의 레코드 정보를 2번 읽어서 하나의 ROW 를 두 개의 ROW 에 나오게 해야 하므로 2개의 데이타를 갖고 있는 테이블과 CARTESIAN JOIN 을 시켜주면 된다.

 

 

아래 쿼리처럼 만든다.

 

SELECT *

    FROM TEST11,

    (

        SELECT ROWNUM CNT

            FROM USER_TABLES

            WHERE ROWNUM < 3

    )      

 

위 쿼리를 실행시키면,

TEST11 에 현재 12개의 행이 있으므로 각 행이 2개짜리 테이블과 조인하므로 

 

CNT 가 1인개 12개,

CNT 가 2인개 12개

 

총 24 개의 행이 생긴다.

아래 그림과 같다(윗쪽과 아래 쪽은 많이 잘린 그림임)

 

 

 

이제 SELECT 하면 된다. 아래와 같이 한다.

위 테이블의 각 ROW 가 아래 쿼리를 거치게 되는 것.

 

 

 

 

SELECT  COLL, DEPT,

        DECODE(CNT, 1, '1학년,2학년', 2, '3학년,4학년') KEY3,

        DECODE(CNT, 1, FRE, 2, SUP) C1,

        DECODE(CNT, 1, JUN, 2, SEN) C2

        FROM TEST11 ,

        (

            SELECT ROWNUM CNT 

                FROM USER_TABLES

                WHERE ROWNUM < 3

        )

 

 

위 쿼리를 실행시키면 아래와 같이 원래 목적했던 모양대로  RESULTSET 이 잘 나온다. 

 

 

 

 

 



      

 

 

 

 

 

 

 

2. 아래는 

http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1010&seq=77 에 있던 내용임.

 

읽어보고 테스트 해 볼 것.

 

SCOTT/TIGER 로 로그인한다.

 

Replies: 2 - Last Post: 2006-08-31 12:41:48 (by 김홍선) - Previous | Next ]
  column을 row로, column-to-row pivot 쿼리   (Posted: 2006-05-19 23:22:03)
  by 김홍선 (Posts: 3760 - Registered: 2006-04-15)
 
  글쓴이 : 김홍선


우리가 많이 알고 있는 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)    새창으로
  by 엑셥   (Posts: 48 - Registered: 2006-08-29)
 
  안녕하세요. 김홍선님. 오늘도 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)    새창으로
  by 김홍선   (Posts: 3760 - Registered: 2006-04-15)
 
  좋은 방법입니다.
그리고 아래와 같이 하셔도 버전에 관계없이 원하는 결과를 얻으실 수 있겠죠.


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#
 
 
 

Replies: 2 - Last Post: 2006-08-31 12:41:48.0 (by 김홍선) - Previous | Next ]

 

 

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86178
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78666
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95398
744 [데이터수집4] 오픈 API 데이터 수집 (소셜미디어 데이터 수집) file 졸리운_곰 2020.06.12 1951
743 [데이터수집3] 관계형 데이터베이스 데이터 수집 file 졸리운_곰 2020.06.12 1317
742 [데이터수집2] 분산시스템 로그 수집 (빅데이터 수집) file 졸리운_곰 2020.06.12 1492
741 [데이터수집1] 웹 크롤링, 웹 스크래핑 file 졸리운_곰 2020.06.12 1804
740 EXPLAIN PLAN 과 explain plan 보기 위한 토드 설정 file 졸리운_곰 2020.06.12 1177
739 PIVOT 쿼리 - 가로세로변환, ROW 단위 자료를 COLUMN 단위 자료로 변환1(개념) file 졸리운_곰 2020.06.12 1838
738 PIVOT 쿼리 - 가로세로변환, ROW 단위 자료를 COLUMN 단위 자료로 변환2(예제2) file 졸리운_곰 2020.06.12 1329
737 PIVOT 쿼리 - 가로세로변환, ROW 단위 자료를 COLUMN 단위 자료로 변환2(예제1) file 졸리운_곰 2020.06.12 1346
» UNPIVOT 쿼리 - 가로세로변환, COLUMN 단위 자료를 ROW 단위 자료로 변환1 file 졸리운_곰 2020.06.12 1462
735 column을 row로 row를 column으로 변환 졸리운_곰 2020.06.12 1527
734 DCGAN in Tensorflow [적대적 신경망] file 졸리운_곰 2020.06.07 1303
733 char-rnn char-rnn-tensorflow-master [한글] [korean] file 졸리운_곰 2020.06.07 1011
732 This Repository is Reinforcement Learning Agent FrameWork file 졸리운_곰 2020.06.07 1354
731 anaconda에서 가상환경 삭제하기 졸리운_곰 2020.06.06 1346
730 Tensorflow 1.4 개발 환경 설치(Windows 10, CUDA 8.0, cuDNN v6.0, GPU 버전) file 졸리운_곰 2020.06.06 1054
729 [Tensorflow] Tensorflow GPU 버전 설치하기 file 졸리운_곰 2020.06.06 2301
728 DBeaver 설치 및 실행 (Window10) file 졸리운_곰 2020.05.26 1739
727 Group By 최대값을 가진 Row를 추출하는 쿼리 졸리운_곰 2020.05.20 1539
726 [오라클|Oracle] String 원하는 만큼 자르기 – SUBSTR 졸리운_곰 2020.05.20 1104
725 [오라클/함수] 문자열 길이 구하기 LENGTH 함수 file 졸리운_곰 2020.05.20 1508
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED