database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 30827 게시물 읽기
No. 30827
쿼리 질문드립니다.
작성자
Hades(무슨쏘리)
작성일
2015-02-28 03:32ⓒ
2015-03-02 02:52ⓜ
조회수
6,386
부서이동이력테이블에 부서종료일은 없고 부서시작일의 필드만 존재하는 상태에서 쿼리를 구현하고자 합니다.
 
## 사원테이블
 
`emp_no` varchar(20) NOT NULL,
`dept_no` varchar(11) NOT NULL,
`emp_nm` varchar(20) NOT NULL,
PRIMARY KEY (emp_no)
) DEFAULT CHARSET=utf8;
 
INSERT INTO tbl_emp (`emp_no`, `dept_no`, `emp_nm`) VALUES ('000001','001','유재석');
INSERT INTO tbl_emp (`emp_no`, `dept_no`, `emp_nm`) VALUES ('000002','001','박명수');
INSERT INTO tbl_emp (`emp_no`, `dept_no`, `emp_nm`) VALUES ('000003','002','정준하');
INSERT INTO tbl_emp (`emp_no`, `dept_no`, `emp_nm`) VALUES ('000004','003','정형돈');
INSERT INTO tbl_emp (`emp_no`, `dept_no`, `emp_nm`) VALUES ('000005','003','노홍철');

 

## 부서테이블

 
CREATE TABLE `tbl_dept` (
  `dept_no` int(11) NOT NULL ,
  `dept_nm` varchar(45) DEFAULT NULL
  PRIMARY KEY (`dept_no`)
) DEFAULT CHARSET=utf8;
 
INSERT INTO tbl_dept (`dept_no`, `dept_nm') VALUES ('001','총무팀');
INSERT INTO tbl_dept (`dept_no`, `dept_nm') VALUES ('002','영업팀');
INSERT INTO tbl_dept (`dept_no`, `dept_nm') VALUES ('003','전략팀');

 

## 부서이동 이력테이블 dc_id : 시퀀스, dc_sdt : 부서근무시작일, dc_detp_no : 부서코드

CREATE TABLE `tbl_emp_history` (
  `dc_id` int(11) NOT NULL AUTO_INCREMENT,
  `emp_no` varchar(20) NOT NULL,
  `dc_sdt` date NOT NULL ,
  `dc_dept_no` int(11) NOT NULL,
  `dc_dept_nm` varchar(45) NOT NULL,
  PRIMARY KEY (`dc_id`)
) DEFAULT CHARSET=utf8;
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('1', '000001','2014-01-10','002','영업팀'); //유재석
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('2', '000002','2014-01-10','004','사업팀'); //박명수
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('3', '000003','2014-01-10','001','총무팀'); //정준하
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('4', '000004','2014-01-10','002','영업팀'); //정형돈
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('5', '000005','2014-01-10','001','총무팀'); //노홍철
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('6', '000006','2014-01-10','003','전략팀'); //하하
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('7', '000001','2014-03-20','001','총무팀'); //유재석
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('8', '000002','2014-04-20','001','총무팀'); //박명수
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('9', '000003','2014-05-20','002','영업팀'); //정준하
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('10','000004','2014-06-20','003','전략팀'); //정형돈
INSERT INTO tbl_emp_history (`dc_id`,`emp_no`,`dc_sdt`,`dc_dept_no`,`dc_dept_nm`) VALUES ('11','000005','2014-07-20','003','전략팀'); //노홍철
 
 
 
 
2014-04-01 ~ 2014-04-30(기준일) 총무팀에서 근무한 인원을 구하는 쿼리
 
결과값
NO 부서명 이름
1 총무팀 유재석
2 총무팀 박명수
3 총무팀 정준하
 
간단하게 생각하고 테이블을 만들었는데 부서이동이력테이블에 종료일이 없어서 난항을 겪고 있습니다.
고수님들의 많은 가르침 배우고 싶습니다.
감사합니다.
 
테이블 수정이 필요하다면 어떻게 수정하는게 제일 좋은 방법일까요?
 
 
 

 

이 글에 대한 댓글이 총 4건 있습니다.

임시로 종료일 컬럼을 만드는 쿼리입니다.

select emp_no, dc_sdt, @prev_dc_sdt , @prev_dc_sdt := dc_sdt

from    tbl_emp_dc, ( select @prev_dc_sdt := '9999-12-31' ) b

order by emp_no, dc_sdt desc

 

위 결과값을 이용하시면 될 듯 합니다.

아싸가오리님이 2015-03-01 08:00에 작성한 댓글입니다. Edit

아싸가오님 조언 감사합니다.

말씀하신 예제로 적용을 해보려 했는데 잘되지 않네요.

알려주신조언은 너무 감사합니다..

Hades(무슨쏘리)님이 2015-03-02 02:03에 작성한 댓글입니다.

염치없지만 마농님 조언부탁드립니다.

Hades(무슨쏘리)님이 2015-03-02 02:53에 작성한 댓글입니다.

SELECT emp_no, dc_sdt, dc_dept_no, dc_dept_nm
     , (SELECT IFNULL(MIN(dc_sdt), '9999-12-31')
          FROM tbl_emp_history
         WHERE emp_no = a.emp_no
           AND dc_sdt > a.dc_sdt
         ORDER BY dc_sdt
         LIMIT 1
        ) AS dc_edt
  FROM tbl_emp_history a
 WHERE dc_dept_nm = '총무팀'
   AND dc_sdt <= '2014-04-31'
   AND (SELECT IFNULL(MIN(dc_sdt), '9999-12-31')
          FROM tbl_emp_history
         WHERE emp_no = a.emp_no
           AND dc_sdt > a.dc_sdt
         ORDER BY dc_sdt
         LIMIT 1
        ) > '2014-04-01'
 ORDER BY emp_no
;

마농(manon94)님이 2015-03-04 17:52에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
30832셀렉트 박스 sql에서 불러오기 가능한가요? [1]
이슬
2015-04-02
4560
30830동시 업데이트 방지 어떻게 하면 될까요? [1]
제록
2015-03-30
4657
30828성능모니터링
초보초보
2015-03-02
5292
30827쿼리 질문드립니다. [4]
Hades
2015-02-28
6386
30825sql 일괄변경 문의 [1]
초보에요
2015-02-27
5449
30824federated engine 추가 후 재시작하지않고 적용할 수 있는 방법
왕초보
2015-02-17
5200
30822Toad for mysql 을 쓰는데 창크기가 너무 큽니다.
홍원기
2015-02-03
5446
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2019 DSN, All rights reserved.
작업시간: 0.082초, 이곳 서비스는
	PostgreSQL v11.5로 자료를 관리합니다