CREATE TABLE SAL_BASE (EMPL_ID VARCHAR2(10) NOT NULL PRIMARY KEY,
REST_GUBUN VARCHAR2(01) NOT NULL );
CREATE TABLE EMPL (EMPL_ID VARCHAR2(10) NOT NULL PRIMARY KEY, EMPL_NAME VARCHAR2(30),
DEPT_CODE VARCHAR2(05) NOT NULL,
GRADE_CODE VARCHAR2(02) );
CREATE TABLE GRADE (GRADE_CODE VARCHAR2(02) NOT NULL PRIMARY KEY,
GRADE_NAME VARCHAR2(30) );
CREATE TABLE DEPT_T (DEPT_CODE VARCHAR2(05) NOT NULL PRIMARY KEY,
DEPT_NAME VARCHAR2(30) );
--
INSERT INTO DEPT_T VALUES ('10','총무부');
INSERT INTO DEPT_T VALUES ('20','인사부');
INSERT INTO DEPT_T VALUES ('30','영업부');
INSERT INTO DEPT_T VALUES ('40','회계부');
INSERT INTO DEPT_T VALUES ('50','무역부');
INSERT INTO DEPT_T VALUES ('60','전산실');
--
INSERT INTO EMPL VALUES ('90001','홍길동','10','01');
INSERT INTO EMPL VALUES ('90002','박말뚝','20','02');
INSERT INTO EMPL VALUES ('90003','이쁜이','10','03');
INSERT INTO EMPL VALUES ('90004','강태공','20','03');
INSERT INTO EMPL VALUES ('91001','정말로','30','03');
INSERT INTO EMPL VALUES ('91002','전도환','30','02');
INSERT INTO EMPL VALUES ('91003','노타이','40','02');
INSERT INTO EMPL VALUES ('91004','김앵삼','40','01');
INSERT INTO EMPL VALUES ('92001','김대줘','40','04');
INSERT INTO EMPL VALUES ('92002','조심해','10','01');
INSERT INTO EMPL VALUES ('92003','최면제','10','01');
--
INSERT INTO GRADE VALUES ('01','부장');
INSERT INTO GRADE VALUES ('02','과장');
INSERT INTO GRADE VALUES ('03','대장');
INSERT INTO GRADE VALUES ('04','사원');
--
INSERT INTO SAL_BASE VALUES ('90001','1');
INSERT INTO SAL_BASE VALUES ('90002','2');
INSERT INTO SAL_BASE VALUES ('90003','1');
INSERT INTO SAL_BASE VALUES ('90004','2');
INSERT INTO SAL_BASE VALUES ('91001','1');
INSERT INTO SAL_BASE VALUES ('91002','2');
INSERT INTO SAL_BASE VALUES ('91003','1');
INSERT INTO SAL_BASE VALUES ('91004','2');
INSERT INTO SAL_BASE VALUES ('92001','1');
INSERT INTO SAL_BASE VALUES ('92002','2');
INSERT INTO SAL_BASE VALUES ('92003','1');
조건.
SAL_BASE 에는 각 사원에대한 격주휴무 정보를 보관하고 있다.
REST_GUBUN = '1' 이면 1,3주 휴무자, '2' 이면 2,4주 휴무자이다.
EMPL 에서는 각 사원에 대한 부서,직급정보및 사원 명칭을 보관한다.
DEPT_T 는 부서 테이블이며,GRADE는 직급 테이블이다.
각 테이블의 정보는 다음과 같다.
EMPL
열 이름 널? 유형
------------------------------ -------- ----
EMPL_ID NOT NULL VARCHAR2(10)
EMPL_NAME VARCHAR2(30)
DEPT_CODE NOT NULL VARCHAR2(5)
GRADE_CODE VARCHAR2(2)
DEPT_T
열 이름 널? 유형
------------------------------ -------- ----
DEPT_CODE NOT NULL VARCHAR2(5)
DEPT_NAME VARCHAR2(30)
SAL_BASE
열 이름 널? 유형
------------------------------ -------- ----
EMPL_ID NOT NULL VARCHAR2(10)
REST_GUBUN NOT NULL VARCHAR2(1)
GRADE
열 이름 널? 유형
------------------------------ -------- ----
GRADE_CODE NOT NULL VARCHAR2(2)
GRADE_NAME VARCHAR2(30)
문제.
이러한 테이블을 이용하여 정보를 다음과 같이 조회하고자한다.
부서 SEQ 1,3주 2,4주
--- -------- ---- -------- -------- ------- ---------
1 총무부 1 부장 최면제 부장 조심해
2 총무부 2 부장 홍길동
3 총무부 3 대장 이쁜이
4 인사부 1 과장 박말뚝
5 인사부 2 대장 강태공
6 영업부 1 대장 정말로 과장 전도환
7 회계부 1 과장 노타이 부장 김앵삼
8 회계부 2 사원 김대줘
해법.
QUERY :
SELECT T1.SER ,T2.DEPT_NAME 부서,T1.SEQ ,T3.GRADE_NAME 홀수주,
T1.AE ,T4.GRADE_NAME 짝수주,T1.BE
FROM (SELECT A.RNO SER,A.DEPT_CODE,B.RNO SEQ,
MAX(DECODE(B.REST_GUBUN,1,GRADE_CODE)) AG,
MAX(DECODE(B.REST_GUBUN,1,EMPL_NAME)) AE,
MAX(DECODE(B.REST_GUBUN,2,GRADE_CODE)) BG,
MAX(DECODE(B.REST_GUBUN,2,EMPL_NAME)) BE
FROM ( SELECT A.DEPT_CODE,B.NO,ROWNUM RNO
FROM (SELECT ROWNUM NO FROM USER_TABLES) B,
(SELECT DEPT_CODE,MAX(CNT) CNT
FROM ( SELECT A.DEPT_CODE,B.REST_GUBUN,COUNT(*) CNT
FROM EMPL A, SAL_BASE B
WHERE B.EMPL_ID = A.EMPL_ID
GROUP BY A.DEPT_CODE,B.REST_GUBUN)
GROUP BY DEPT_CODE
) A
WHERE B.NO <= A.CNT
) A,
( SELECT A.NO,A.RNO,B.DEPT_CODE,B.REST_GUBUN,
B.GRADE_CODE,B.EMPL_NAME
FROM ( SELECT ROWNUM NO,A.RNO
FROM (SELECT ROWNUM RNO FROM USER_TABLES) A,
(SELECT A.DEPT_CODE,B.REST_GUBUN,COUNT(*) CNT
FROM EMPL A,SAL_BASE B
WHERE B.EMPL_ID = A.EMPL_ID
GROUP BY A.DEPT_CODE,B.REST_GUBUN) B
WHERE A.RNO <= CNT) A,
(SELECT ROWNUM RNO,DEPT_CODE,REST_GUBUN,
GRADE_CODE,EMPL_NAME
FROM (SELECT A.DEPT_CODE,B.REST_GUBUN,
A.GRADE_CODE,A.EMPL_NAME
FROM EMPL A,SAL_BASE B
WHERE B.EMPL_ID = A.EMPL_ID
GROUP BY A.DEPT_CODE,B.REST_GUBUN,
A.GRADE_CODE,A.EMPL_NAME)) B
WHERE B.RNO = A.NO ) B
WHERE B.DEPT_CODE = A.DEPT_CODE
AND B.RNO = A.NO
GROUP BY A.RNO,A.DEPT_CODE,B.RNO
) T1,
DEPT_T T2,
GRADE T3,
GRADE T4
WHERE T2.DEPT_CODE(+) = T1.DEPT_CODE
AND T3.GRADE_CODE(+) = T1.AG
AND T4.GRADE_CODE(+) = T1.BG
단계별 해법은 시간이 허락하는대로 올리겠습니다.
위의 QUERY가 정답은 아닙니다.
단지 하나의 해법일 뿐입니다.
더 좋은 해법이 있으신 분은 방명록에 답을 올려 주시면 감사하겠습니다.
REST_GUBUN VARCHAR2(01) NOT NULL );
CREATE TABLE EMPL (EMPL_ID VARCHAR2(10) NOT NULL PRIMARY KEY, EMPL_NAME VARCHAR2(30),
DEPT_CODE VARCHAR2(05) NOT NULL,
GRADE_CODE VARCHAR2(02) );
CREATE TABLE GRADE (GRADE_CODE VARCHAR2(02) NOT NULL PRIMARY KEY,
GRADE_NAME VARCHAR2(30) );
CREATE TABLE DEPT_T (DEPT_CODE VARCHAR2(05) NOT NULL PRIMARY KEY,
DEPT_NAME VARCHAR2(30) );
--
INSERT INTO DEPT_T VALUES ('10','총무부');
INSERT INTO DEPT_T VALUES ('20','인사부');
INSERT INTO DEPT_T VALUES ('30','영업부');
INSERT INTO DEPT_T VALUES ('40','회계부');
INSERT INTO DEPT_T VALUES ('50','무역부');
INSERT INTO DEPT_T VALUES ('60','전산실');
--
INSERT INTO EMPL VALUES ('90001','홍길동','10','01');
INSERT INTO EMPL VALUES ('90002','박말뚝','20','02');
INSERT INTO EMPL VALUES ('90003','이쁜이','10','03');
INSERT INTO EMPL VALUES ('90004','강태공','20','03');
INSERT INTO EMPL VALUES ('91001','정말로','30','03');
INSERT INTO EMPL VALUES ('91002','전도환','30','02');
INSERT INTO EMPL VALUES ('91003','노타이','40','02');
INSERT INTO EMPL VALUES ('91004','김앵삼','40','01');
INSERT INTO EMPL VALUES ('92001','김대줘','40','04');
INSERT INTO EMPL VALUES ('92002','조심해','10','01');
INSERT INTO EMPL VALUES ('92003','최면제','10','01');
--
INSERT INTO GRADE VALUES ('01','부장');
INSERT INTO GRADE VALUES ('02','과장');
INSERT INTO GRADE VALUES ('03','대장');
INSERT INTO GRADE VALUES ('04','사원');
--
INSERT INTO SAL_BASE VALUES ('90001','1');
INSERT INTO SAL_BASE VALUES ('90002','2');
INSERT INTO SAL_BASE VALUES ('90003','1');
INSERT INTO SAL_BASE VALUES ('90004','2');
INSERT INTO SAL_BASE VALUES ('91001','1');
INSERT INTO SAL_BASE VALUES ('91002','2');
INSERT INTO SAL_BASE VALUES ('91003','1');
INSERT INTO SAL_BASE VALUES ('91004','2');
INSERT INTO SAL_BASE VALUES ('92001','1');
INSERT INTO SAL_BASE VALUES ('92002','2');
INSERT INTO SAL_BASE VALUES ('92003','1');
조건.
SAL_BASE 에는 각 사원에대한 격주휴무 정보를 보관하고 있다.
REST_GUBUN = '1' 이면 1,3주 휴무자, '2' 이면 2,4주 휴무자이다.
EMPL 에서는 각 사원에 대한 부서,직급정보및 사원 명칭을 보관한다.
DEPT_T 는 부서 테이블이며,GRADE는 직급 테이블이다.
각 테이블의 정보는 다음과 같다.
EMPL
열 이름 널? 유형
------------------------------ -------- ----
EMPL_ID NOT NULL VARCHAR2(10)
EMPL_NAME VARCHAR2(30)
DEPT_CODE NOT NULL VARCHAR2(5)
GRADE_CODE VARCHAR2(2)
DEPT_T
열 이름 널? 유형
------------------------------ -------- ----
DEPT_CODE NOT NULL VARCHAR2(5)
DEPT_NAME VARCHAR2(30)
SAL_BASE
열 이름 널? 유형
------------------------------ -------- ----
EMPL_ID NOT NULL VARCHAR2(10)
REST_GUBUN NOT NULL VARCHAR2(1)
GRADE
열 이름 널? 유형
------------------------------ -------- ----
GRADE_CODE NOT NULL VARCHAR2(2)
GRADE_NAME VARCHAR2(30)
문제.
이러한 테이블을 이용하여 정보를 다음과 같이 조회하고자한다.
부서 SEQ 1,3주 2,4주
--- -------- ---- -------- -------- ------- ---------
1 총무부 1 부장 최면제 부장 조심해
2 총무부 2 부장 홍길동
3 총무부 3 대장 이쁜이
4 인사부 1 과장 박말뚝
5 인사부 2 대장 강태공
6 영업부 1 대장 정말로 과장 전도환
7 회계부 1 과장 노타이 부장 김앵삼
8 회계부 2 사원 김대줘
해법.
QUERY :
SELECT T1.SER ,T2.DEPT_NAME 부서,T1.SEQ ,T3.GRADE_NAME 홀수주,
T1.AE ,T4.GRADE_NAME 짝수주,T1.BE
FROM (SELECT A.RNO SER,A.DEPT_CODE,B.RNO SEQ,
MAX(DECODE(B.REST_GUBUN,1,GRADE_CODE)) AG,
MAX(DECODE(B.REST_GUBUN,1,EMPL_NAME)) AE,
MAX(DECODE(B.REST_GUBUN,2,GRADE_CODE)) BG,
MAX(DECODE(B.REST_GUBUN,2,EMPL_NAME)) BE
FROM ( SELECT A.DEPT_CODE,B.NO,ROWNUM RNO
FROM (SELECT ROWNUM NO FROM USER_TABLES) B,
(SELECT DEPT_CODE,MAX(CNT) CNT
FROM ( SELECT A.DEPT_CODE,B.REST_GUBUN,COUNT(*) CNT
FROM EMPL A, SAL_BASE B
WHERE B.EMPL_ID = A.EMPL_ID
GROUP BY A.DEPT_CODE,B.REST_GUBUN)
GROUP BY DEPT_CODE
) A
WHERE B.NO <= A.CNT
) A,
( SELECT A.NO,A.RNO,B.DEPT_CODE,B.REST_GUBUN,
B.GRADE_CODE,B.EMPL_NAME
FROM ( SELECT ROWNUM NO,A.RNO
FROM (SELECT ROWNUM RNO FROM USER_TABLES) A,
(SELECT A.DEPT_CODE,B.REST_GUBUN,COUNT(*) CNT
FROM EMPL A,SAL_BASE B
WHERE B.EMPL_ID = A.EMPL_ID
GROUP BY A.DEPT_CODE,B.REST_GUBUN) B
WHERE A.RNO <= CNT) A,
(SELECT ROWNUM RNO,DEPT_CODE,REST_GUBUN,
GRADE_CODE,EMPL_NAME
FROM (SELECT A.DEPT_CODE,B.REST_GUBUN,
A.GRADE_CODE,A.EMPL_NAME
FROM EMPL A,SAL_BASE B
WHERE B.EMPL_ID = A.EMPL_ID
GROUP BY A.DEPT_CODE,B.REST_GUBUN,
A.GRADE_CODE,A.EMPL_NAME)) B
WHERE B.RNO = A.NO ) B
WHERE B.DEPT_CODE = A.DEPT_CODE
AND B.RNO = A.NO
GROUP BY A.RNO,A.DEPT_CODE,B.RNO
) T1,
DEPT_T T2,
GRADE T3,
GRADE T4
WHERE T2.DEPT_CODE(+) = T1.DEPT_CODE
AND T3.GRADE_CODE(+) = T1.AG
AND T4.GRADE_CODE(+) = T1.BG
단계별 해법은 시간이 허락하는대로 올리겠습니다.
위의 QUERY가 정답은 아닙니다.
단지 하나의 해법일 뿐입니다.
더 좋은 해법이 있으신 분은 방명록에 답을 올려 주시면 감사하겠습니다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
34 | 반올림 DATA의 오차보정 | 운영자 | 2002.09.18 | 3585 |
33 | 복제를이용한 합계계에서 비율계산 | 운영자 | 2002.09.18 | 3669 |
32 | DATA변환 | 운영자 | 2002.09.18 | 2750 |
31 | 중간값구하기 | 운영자 | 2002.09.18 | 3377 |
30 | 한번 읽은 테이블로 백분율 구하기 | 운영자 | 2002.09.18 | 4085 |
29 | 빠진이빨찾기 III | 운영자 | 2002.09.18 | 3359 |
28 | 빠진이빨찾기 II | 운영자 | 2002.09.18 | 3067 |
27 | 빠진이빨찾기 | 운영자 | 2002.09.18 | 3122 |
26 | 순환참조에서의 상위코드로집계 | 운영자 | 2002.09.18 | 3226 |
25 | CONNECT BY의 SORT와 JOIN | 운영자 | 2002.09.18 | 2811 |
24 | REPORT 양식맞추기4 | 운영자 | 2002.09.18 | 2597 |
23 | REPORT 양식 맞추기 III | 운영자 | 2002.09.18 | 3015 |
22 | REPORT 양식 맞추기 II | 운영자 | 2002.09.18 | 2646 |
21 | REPORT 양식 맞추기 | 운영자 | 2002.09.18 | 31359 |
20 | 1:1 JOIN / 1:M JOIN | 운영자 | 2002.09.18 | 3000 |
19 | TUNING-01 | 운영자 | 2002.09.18 | 2739 |
18 | 소계와 합계 | 운영자 | 2002.09.18 | 3489 |
17 | 중복DATA 찾아내기 | 운영자 | 2002.09.17 | 2817 |
» | GROUP별 DATA 분류 | 운영자 | 2002.09.17 | 2982 |
15 | PARAMETER값에 따라 변경이 일어나는 문장 | 운영자 | 2002.09.17 | 15808 |