아이디어 좀 주세요 0 5 2,298

by 다솜여우 [SQL Query] [2010.02.05 11:26:43]



혼자서 생각해도 답이 안 나와서요...
아이디어 좀 주세요~~

=============================================================
회원 테이블
dept_no : 지역번호
emp_no : 회원번호(시스템 자동 부여 번호)
emp_id : 회원ID(emp_no와 맵핑되는 id로써, 사원 개인의 번호)
emp_name : 회원이름

dept_no    emp_no    emp_id emp_name
---------------------------------------------------------------
001    001001 K001     김길동
001    001002  K002     박영희
.................
002    002001 S001     고은미
002    002002 S002     김사랑
.................

수강 테이블
dept_no : 지역번호
job_no : 강좌 번호
job_name : 강좌 이름(지역별로 개설 강좌의 종류는 다양함)

dept_no    job_no    job_name
---------------------------------------------------------------
001  0  수영
001 1   헬쓰
~~
001 13 골프
002 0   수영
002 1   탁구
002 2   골프
~~
002 20     요가
....................

수강검수 테이블
dept_no : 지역번호
emp_no : 회원번호
job_no : 강좌 번호
gum : 수강 재확인 여부. 코드성 데이터가 저장됨(1 : 입력, 2 : 검수완료)
gumsu : 입력 횟수
gum_date : 입력일

dept_no emp_no    job_no   gum   gumsu   gum_date
==========================================
001    001001   0     1     1   20100201
001    001001   0     1     2   20100201
001    001001   0 2 3   20100201
001    001001   3     1     1   20100201
001    001001   3     1 2   20100201
002    002002  0     1     1   20100204
002    002002  1     1     1   20100204
002    002002      0 2 2   20100205
~~
001    001001   13   2 10 20100206
~~

김길동이 수강신청을 하면, C테이블에 입력횟수와 입력일 그리고 수강 재확인 여부가 저장됩니다.
(검수버튼을 누르고 저장을 할 경우 "gum=2"가 됩니다.)

요구사항은 "회원마다 수강과목 별로 수강신청 유무와 검수유무를 했는지 확인" 할 수 있게 해야합니다.
결과 형태는 아래와 같습니다.

[ 요구하는 결과 형태 ]
emp_id    job_no emp_id   0    1     2   3    4    5 .... 13
------------------------------     ⇒   ----------------------------------------------------------------------
K001  max(gum)     K001  2     2    1   1    2    1    2
K002  max( gum)    K002 2     1    1   1    1    1    1  
..........  .....................
S001  max(gum)     S001  2     2    2   2    2    2    2
S002  max( gum)    S002 2     1    1   1    1    1    1 


좀 도와주세요....
답이 안 나오네요... ㅠㅠ
by 마농 [2010.02.05 13:50:37]
SELECT a.dept_no, a.emp_id, a.emp_name
, b.g00
, b.g01
, b.g02
, b.g03
, b.g04
, b.g05
, b.g06
, b.g07
, b.g08
, b.g09
, b.g10
, b.g11
, b.g12
, b.g13
FROM 회원 a
, (
SELECT dept_no, emp_no, job_no
, MAX(DECODE(job_no, 0,gum) g00
, MAX(DECODE(job_no, 1,gum) g01
, MAX(DECODE(job_no, 2,gum) g02
, MAX(DECODE(job_no, 3,gum) g03
, MAX(DECODE(job_no, 4,gum) g04
, MAX(DECODE(job_no, 5,gum) g05
, MAX(DECODE(job_no, 6,gum) g06
, MAX(DECODE(job_no, 7,gum) g07
, MAX(DECODE(job_no, 8,gum) g08
, MAX(DECODE(job_no, 9,gum) g09
, MAX(DECODE(job_no,10,gum) g10
, MAX(DECODE(job_no,11,gum) g11
, MAX(DECODE(job_no,12,gum) g12
, MAX(DECODE(job_no,13,gum) g13
FROM 수강검수
GROUP BY dept_no, emp_no, job_no
) b
WHERE a.dept_no = b.dept_no(+)
AND a.emp_no = b.emp_no(+)
;

by v상이v [2010.02.05 14:02:19]
아...전 문제 파악도 안됬는데...아아...
근데...글쓰신님의 요구 결과는 그룹화를 통한 MAX값을 가져오는거 같은데...
그룹화를 한다고 하면
emp_id 로만 하면 되는것인지...gum_date 로 뽑아야 되는 것인지...
또한 그룹화시...중복되는 데이터에 관한 처리여부는...?....

아니면..제가 생각이 잘못하고 있는건가요??
마농님 답변이 맞다면 전 잘못생각하고 있는거 같아서요...^^;;

by 마농 [2010.02.05 14:11:11]
MAX(DECODE() 에 우괄호가 부족하네용.

by 다솜여우 [2010.02.05 14:36:45]
마농님 감사합니다..
저도 마농님처럼 쿼리를 돌려서 값을 얻었습니다.
근데 머리가 아팠던건요...
수강테이블에서요.. 지역마다 개설강좌가 다양하다는 점입니다.
이 경우, 모두 지역의 job_no를 쿼리에 박아줘야해서요...
근데 제가 원하는건 ... job_no를 쿼리에 박지 않고 결과를 내고 싶은거예요...
역시 쿼리의 세계는 어렵네요~~^^;;

by 마농 [2010.02.05 14:45:48]
가변적 열을 만들어 내야 하는 경우 처리 방법
1. 최대 개설강좌 번호만큼 decode를 다 써주는 방법
2. 동적쿼리를 이용
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입