Oracle 동적 Pivot..으로 해야할까요? 선배님들 도움을 부탁드립니다. 0 1 7,810

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반'); 

 

by 마농 [2021.04.20 10:45:34]

피벗 쿼리는 대상 값의 종류와 개수가 고정으로 정해져야 합니다.
가변으로 적용하려면 동적쿼리를 이용해야 하는데.
동적쿼리는 쿼리 영역이 아닌 프로그래밍 영역입니다.
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)
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입