by teachMe [SQL Query] Oracle Pivot 동적 [2021.04.19 23:27:47]
안녕하세요. 선배님들! 초보 개발자입니다..
다름아니라 프로젝트에서 쿼리를 짜야하는데 몇일째 진도를 못나가고 있어서.. 도움을 부탁드리려고 글을 남깁니다.. ㅠ!
Pivot도 많이 써보지는 않았는데.. 컬럼과 row가 가변적인 데이터라서 어떤 방법으로 풀어야할지 방향을 잘 못잡고 있습니다.. 힌트라도 남겨주시면 감사하겠습니다.!
아래 가볍게 데이터를 만들어 봤습니다.
원하는 출력 결과 아래쪽!<--결과--> 는 이러한데,
컬럼부분에는 GRADE에 들어있는 row가 전부 출력이 되어야하며.. 어디까지 생성될지 알 수 없습니다.. A~ZZ
row는 EXAM_RESULT에 있는 CLASS별 인원 및 등급 현황이 나와야 하는데.. CLASS도 어디까지 데이터가 들어가 있을지 알 수 없..습니다...
이럴때.. PIVOT을 쓰는게 맞을까요? 맞다면... 동적 PIVOT일 것 같은데.. 프로시저? 말고는 방법이 없는 것인지 선배님들 조그마한 도움이라도 방향이라도 부탁드립니다. 감사합니다.!!
------------결과-------------
/***********************************************************
[학급/반] [인원] [A]점수 [B]점수 [C]점수 [D]점수 [E]점수...
1반 8 3 2 2 0 1 ...
2반 7 2 1 0 0 2 ...
전체 15 5 3 2 0 3 ...
************************************************************/
------------결과-------------
CREATE TABLE GRADE_BASE ( GRADE VARCHAR2(10 BYTE) ); CREATE TABLE CLASS_BASE ( CLASS VARCHAR2(10 BYTE) ); CREATE TABLE EXAM_RESULT ( GRADE VARCHAR2(10 BYTE), CLASS VARCHAR2(10 BYTE), EMPID VARCHAR2(5 BYTE) ); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('A','1반','10001'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('A','1반','10002'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('A','1반','10003'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('B','1반','10004'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('B','1반','10005'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('C','1반','10006'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('C','1반','10007'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('E','1반','10008'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('A','2반','20001'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('A','2반','20002'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('B','2반','20003'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('E','2반','20004'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('E','2반','20005'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('F','2반','20006'); INSERT INTO EXAM_RESULT (GRADE,CLASS,EMPID) VALUES ('F','2반','20007'); INSERT INTO GRADE_BASE (GRADE) VALUES ('A'); INSERT INTO GRADE_BASE (GRADE) VALUES ('B'); INSERT INTO GRADE_BASE (GRADE) VALUES ('C'); INSERT INTO GRADE_BASE (GRADE) VALUES ('D'); INSERT INTO GRADE_BASE (GRADE) VALUES ('E'); INSERT INTO GRADE_BASE (GRADE) VALUES ('F'); INSERT INTO CLASS_BASE (CLASS) VALUES ('1반'); INSERT INTO CLASS_BASE (CLASS) VALUES ('2반'); INSERT INTO CLASS_BASE (CLASS) VALUES ('3반'); INSERT INTO CLASS_BASE (CLASS) VALUES ('4반'); INSERT INTO CLASS_BASE (CLASS) VALUES ('5반');
피벗 쿼리는 대상 값의 종류와 개수가 고정으로 정해져야 합니다.
가변으로 적용하려면 동적쿼리를 이용해야 하는데.
동적쿼리는 쿼리 영역이 아닌 프로그래밍 영역입니다.
http://gurubee.net/article/19612
SELECT NVL(class, '전체') class , COUNT(*) tot -- 동적 추가 Start -- , COUNT(DECODE(grade, 'A', 1)) A , COUNT(DECODE(grade, 'B', 1)) B , COUNT(DECODE(grade, 'C', 1)) C , COUNT(DECODE(grade, 'D', 1)) D , COUNT(DECODE(grade, 'E', 1)) E -- , COUNT(DECODE(grade, 'F', 1)) F -- 동적 추가 End -- FROM exam_result GROUP BY ROLLUP(class) ;