Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 해외여행
- 휴식
- 부천파티룸
- 스컬킹점수
- 개발자
- 취미
- 웹개발
- 스컬킹점수계산
- 부천공간대여
- 착한코딩
- 보드게임점수계산
- 서울파티룸
- 옥길동요거트
- 존경하는위인
- 옥길파티룸
- 코딩
- 옥길요거트
- MBTI
- 옥길동파티룸
- 일
- 그릭요거트
- 광명파티룸
- 스페이스우일
- 스컬킹
- 구로파티룸
- 옥길그릭요거트
- mysql
- 보드게임점수
- 파티룸
- 가장존경하는인물
Archives
- Today
- Total
SIMPLE & UNIQUE
[착한코딩_실무에서 유용한 SQL 쿼리_Pivot] 오라클 SQL 쿼리 본문
-- SURVEY 테이블을 만든다
CREATE TABLE SURVEY (
USER_NAME VARCHAR2(20),--사용자 이름
QUESTION VARCHAR2(20),--질문 번호
ANSWER1 VARCHAR2(20),--객관식 답변
ANSWER2 VARCHAR2(20),--주관식 답변
CONSTRAINT SURVEY_PK PRIMARY KEY (USER_NAME, QUESTION)
);
-- SURVEY 테이블을 지운다
-- DROP TABLE SURVEY;
-- SURVEY 테이블의 데이터 지운다
-- DELETE TABLE SURVEY;
-- 테이블이 정상적으로 생성된 것을 확인
SELECT * FROM SURVEY;
-- 홍길동, 강감찬, 이순신 3명의 고객이
-- 5개의 질문에 답변한 데이터를 INSERT 한다
-- 1,2,3,5는 객관식, 4는 주관식
INSERT INTO SURVEY VALUES('홍길동', 1, 3, NULL);
INSERT INTO SURVEY VALUES('홍길동', 2, 5, NULL);
INSERT INTO SURVEY VALUES('홍길동', 3, 2, NULL);
INSERT INTO SURVEY VALUES('홍길동', 4, NULL, '허균');
INSERT INTO SURVEY VALUES('홍길동', 5, 1, NULL);
INSERT INTO SURVEY VALUES('강감찬', 1, 3, NULL);
INSERT INTO SURVEY VALUES('강감찬', 2, 1, NULL);
INSERT INTO SURVEY VALUES('강감찬', 3, 2, NULL);
INSERT INTO SURVEY VALUES('강감찬', 4, NULL, '귀주대첩');
INSERT INTO SURVEY VALUES('강감찬', 5, 2, NULL);
INSERT INTO SURVEY VALUES('이순신', 1, 4, NULL);
INSERT INTO SURVEY VALUES('이순신', 2, 1, NULL);
INSERT INTO SURVEY VALUES('이순신', 3, 4, NULL);
INSERT INTO SURVEY VALUES('이순신', 4, NULL, '명량해전');
INSERT INTO SURVEY VALUES('이순신', 5, 5, NULL);
-- INSERT된 데이터를 확인한다.
SELECT * FROM SURVEY;
-- PIVOT 함수를 사용해 행을 열로 변환한다.
SELECT * FROM SURVEY
PIVOT(MAX(ANSWER1) FOR QUESTION IN (1,2,3,4,5)
);
--주관식일 경우, ANSWER1컬럼을 주관식 답으로 대체한다.
WITH TEMP_TABLE AS
(
SELECT
USER_NAME,
QUESTION,
CASE WHEN ANSWER2 IS NOT NULL THEN ANSWER2
ELSE ANSWER1
END ANSWER1
FROM SURVEY
)
SELECT * FROM TEMP_TABLE
PIVOT(MAX(ANSWER1) FOR QUESTION IN (1,2,3,4,5));
[QUESTION IN 절 뒤에 상수가 아닌 조회된 값을 사용하는 방법]
XML문법으로 서브쿼리를 사용하는 방법과 다이나믹 SQL문법을 사용하는 방법이 있는데요.
아래 블로그의 다이나믹 SQL문을 참고해서, 위에 예제에 맞게 수정했습니다.
CREATE OR REPLACE PROCEDURE pc_dynamic_pivot(p_cursor in out sys_refcursor)
AS
sql_param VARCHAR2(1000);
sql_query VARCHAR2(4000);
BEGIN
FOR x IN (SELECT DISTINCT QUESTION FROM SURVEY)
LOOP
sql_param := sql_param || '''' || x.QUESTION || '''' || ', ';
END LOOP;
sql_param := SUBSTR(sql_param, 1, LENGTH(sql_param)-2);
sql_query := sql_query || ' SELECT * ';
sql_query := sql_query || ' FROM SURVEY ';
sql_query := sql_query || ' PIVOT( MAX(ANSWER1) FOR QUESTION ';
sql_query := sql_query || ' IN (' || sql_param || ') ';
sql_query := sql_query || ' ) ';
open p_cursor for sql_query;
END;
var rc refcursor
exec pc_dynamic_pivot(:rc)
print rc;
** 참고 블로그 : https://gent.tistory.com/336
'착한코딩 YouTube' 카테고리의 다른 글
SQL 쿼리_6강 SQL 데이터 중복 처리 예제 소스(REPLACE, DUPLICATE, MERGE) (0) | 2024.07.22 |
---|---|
스컬킹 점수판_착한코딩.xlsx (0) | 2024.01.31 |
[착한코딩_실무에서 유용한 SQL 쿼리_Excel to DB] 예제 엑셀 파일 (0) | 2022.08.07 |
[실생활에 유용한 자바스크립트 1강] 온라인 교육 2배속으로 보기 (0) | 2022.04.28 |
[착한코딩_실무에서 유용한 SQL 쿼리_TIMESTAMP] 오라클 SQL 쿼리 (0) | 2022.01.10 |
Comments