안녕하세요 query에 약한 오라클dba 입니다. 업무단에서 요청온 내용이 있는데 query에 약해서 고수분들께 문의드립니다 ㅠ
SELECT 로 조회된 결과들이 있다고 가정했을 때.. 예를 들어
SELECT DATE, NAME, TITLE, APPR_ROLE
FROM DOC
WHERE DOC_ID='문서번호'
이런식으로 특정 문서 ID를 조건으로 기안자, 중간 결재자(들), 최종 결재자를 받아오는 SELECT 문이 있습니다.
이때 APPR_ROLE에 따라 예를들어
APPR_ROLE = 1 이면 기안자
APPR_ROLE = 2 이면 중간결재자
APPR_ROLE = 3 이면 최종결재자
이런식으로 구분을 하고 있습니다.
이때 출력된 결과들을 임시테이블에 입력을 해야하는데 하나의 ROW에 들어가게끔 해야합니다.
결재문서에 따라 중간 결재자의 수가 변하기 때문에 임시 테이블의 컬럼들은 넉넉하게 잡아 두었습니다.
테이블 구성은 다음과 같습니다.
APPR_USER.IMSI_APPROVAL
DRAFT_DATE DATE,
DRAFTER_NAME VARCHAR2(50),
TITLE VARCHAR2(50),
END_APPR_NAME VARCHAR2(15), --최종결재자
END_APPR_DATE DATE, --결재일자
MIDDLE_APPR_NAME_0 VARCHAR2(15) -- 중간결재자0
MIDDLE_APPR_DATE_0 DATE, --결재일자0
MIDDLE_APPR_NAME_1 VARCHAR2(15) -- 중간결재자1
MIDDLE_APPR_DATE_0 DATE, -- 결재일자1
MIDDLE_APPR_NAME_2 VARCHAR2(15) -- 중간결재자2
MIDDLE_APPR_DATE_0 DATE, -- 결재일자2
.
.
.
위와 같은 임시테이블에 데이터를 넣고 싶은데.. 한 ROW에 들어가게 해야합니다 ㅠ
APPR_ROLE 이 2인 인원들이 최소 1명에서 최대 10명정도까지 되기 때문에
예를들어 APPR_ROLE=2 인 인원들 즉 중간결재자들이 3명이라고 쳤을 때 데이터는
MIDDLE_APPR_NAME_0, MIDDLE_APPR_DATE_0,
MIDDLE_APPR_NAME_1, MIDDLE_APPR_DATE_1,
MIDDLE_APPR_NAME_2, MIDDLE_APPR_DATE_2
한개의 ROW 총 6개의 컬럼에 값이 들어가야합니다.
그래서 아래와 같이 오라클의 INSERT + WHEN 구문을 이용해서 넣어볼려고 하는데 어떻게 하면 한 row에 들어가게해야하는지
잘 모르겠네요 ㅠ
INSERT FIRST(ALL)
WHEN APPR_ROLE=1 THEN
INTO APPR_USER.IMSI_APPROVAL (컬럼값) VALUES (컬럼값)
WHEN APPR_ROLE=2 THEN
INTO APPR_USER.IMSI_APPROVAL (컬럼값) VALUES (컬럼값)
..
..
..
SELECT DATE, NAME, TITLE, APPR_ROLE
FROM DOC
WHERE DOC_ID='문서번호'
;
회사 개발자분들한테 물어보자니 눈치도 좀 보이구해서 여쭤봅니다 ㅠ
Comment 2
-
착한넘
2014.01.10 14:25
원하시는 답변인지 모르겟네요~~ 이런식으로 넣으시면 될것 같은데요with Test AS (SELECT '1001' Doc_ID, '20140101' [Date], '1' [Appr_Role], '기안자' Name UNION ALLSELECT '1001' Doc_ID, '20140102' [Date], '2' [Appr_Role], '아무개' Name UNION ALLSELECT '1001' Doc_ID, '20140103' [Date], '2' [Appr_Role], '아무개2' Name UNION ALLSELECT '1001' Doc_ID, '20140104' [Date], '2' [Appr_Role], '홍길동1' Name UNION ALLSELECT '1001' Doc_ID, '20140105' [Date], '2' [Appr_Role], '홍길동2' Name UNION ALLSELECT '1001' Doc_ID, '20140106' [Date], '2' [Appr_Role], '홍길동3' Name UNION ALLSELECT '1001' Doc_ID, '20140107' [Date], '3' [Appr_Role], '최종자' Name)SELECT Doc_ID, MAX(CASE WHEN Appr_Role = '1' THEN '기안자' END) MIDDLE_APPR_NAME_first, MAX(CASE WHEN Appr_Role = '1' THEN [Date] END) MIDDLE_APPR_Date_First, MAX(CASE WHEN Appr_Role = '2' AND rownum = 1 THEN Name END) MIDDLE_APPR_NAME_1, MAX(CASE WHEN Appr_Role = '2' AND rownum = 1 THEN [Date] END) MIDDLE_APPR_Date_1, MAX(CASE WHEN Appr_Role = '2' AND rownum = 2 THEN Name END) MIDDLE_APPR_NAME_2, MAX(CASE WHEN Appr_Role = '2' AND rownum = 2 THEN [Date] END) MIDDLE_APPR_Date_2--- 생략, MAX(CASE WHEN Appr_Role = '2' AND rownum = 10 THEN Name END) MIDDLE_APPR_NAME_10, MAX(CASE WHEN Appr_Role = '2' AND rownum = 10 THEN [Date] END) MIDDLE_APPR_Date_10, MAX(CASE WHEN Appr_Role = '3' THEN Name END) MIDDLE_APPR_NAME_LAST, MAX(CASE WHEN Appr_Role = '3' THEN [Date] END) MIDDLE_APPR_Date_LASTFROM (SELECT Doc_ID, [Date], Appr_Role, Name, ROW_NUMBER() OVER(PARTITION BY Doc_ID, appr_Role ORDER BY [Date]) rownumFROM TestWHERE Doc_ID = '1001') aGROUP BY Doc_ID -
귀여운첼시
2014.01.10 15:36
아! 정말 감사드립니다~ 응용해서 하니 잘 되네요 감사합니다~~