- 전체
- Sample DB
- database modeling
- [표준 SQL] Standard SQL
- G-SQL
- 10-Min
- ORACLE
- MS SQLserver
- MySQL
- SQLite
- postgreSQL
- 데이터아키텍처전문가 - 국가공인자격
- 데이터 분석 전문가 [ADP]
- [국가공인] SQL 개발자/전문가
- NoSQL
- hadoop
- hadoop eco system
- big data (빅데이터)
- stat(통계) R 언어
- XML DB & XQuery
- spark
- DataBase Tool
- 데이터분석 & 데이터사이언스
- Engineer Quality Management
- [기계학습] machine learning
- 데이터 수집 및 전처리
- 국가기술자격 빅데이터분석기사
- 암호화폐 (비트코인, cryptocurrency, bitcoin)
ORACLE UNPIVOT 쿼리 - 가로세로변환, COLUMN 단위 자료를 ROW 단위 자료로 변환1
2020.06.12 17:25
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 개의 행이 생긴다. 아래 그림과 같다(아래 쪽은 많이 잘린 그림임)
위 테이블의 각 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 이 나온다.
......................... 중간 생략 ..........................
** 현재 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 ] |
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
Replies: 2 - Last Post: 2006-08-31 12:41:48.0 (by 김홍선) - [ Previous | Next ]
|
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 공지 | 오라클 기본 샘플 데이터베이스 | 졸리운_곰 | 2014.01.02 | 86311 |
| 공지 | [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE | 가을의 곰을... | 2013.02.10 | 78766 |
| 공지 | [G_SQL] Sample Database | 가을의 곰을... | 2012.05.20 | 95513 |









