distinct ? Group by ? .. 근무시작일과 근무종료일을 합칠경우. 0 3 3,915

by 손님 distinct group by [2012.09.11 17:15:51]



usrId usrNm issSeq issDt issCd appDt canDt place
aaa001 홍길동 seq00001 20051027 10 20051027   전남
aaa001 홍길동 seq00002 20121026 20   20121026 전남
aaa002 이순신 seq00003 20061222 10 20061222   전남
aaa002 이순신 seq00004 20121221 20   20121221 전남
aaa004 김홍동 seq00005 20061018 10 20061018   전남
aaa004 김홍동 seq00006 20121017 20   20121017 전남
aaa005 최자 seq00007 19981101 10 19981101   서울
aaa005 최자 seq00008 20121204 20   20121204 서울
aaa007 이미 seq00009 20010704 10 20010704   경남
aaa007 이미 seq00010 20060921 20   20060921 경남
aaa007 이미 seq00011 20060921 10 20060921   경남
aaa007 이미 seq00012 20120920 20   20120920 경남
aaa008 박호 seq00013 20060912 10 20060912   충남
aaa008 박호 seq00014 20120911 20   20120911 충남
aaa006 김길동 seq00015 20001006 10 20001006   경남
aaa006 김길동 seq00016 20061005 20   20061005 경남
aaa006 김길동 seq00017 20061006 10 20061006   경남
aaa006 김길동 seq00018 20121005 20   20121005 경남
aaa003 주최자 seq00019 20060907 10 20060907   부산
aaa003 주최자 seq00020 20120906 20   20120906 부산
aaa003 주최자 seq00021 20120907 10 20120907   부산


위와 같은 형태의 테이블과 데이터가 있는경우에요.

appDt는 근무시작일, canDt는 근무종료일입니다.

종료일이 없는경우는 아직 근무중인것이구요.

테이블의 PK는 issSeq 이구요. issCd 는 근무시작(10)인지, 근무종료(20)인지 코드값입니다.

현재와 같을경우, 근무시작일과 종료일을 같은 ROW에 둘순없을까요?.. issSeq, issDt, issCd 는 종료일 기준으로 가지고 오고,

종료가 없고 시작만 있는 사람의 경우. 시작 열을 그대로 두구요,

아니면 issSeq, issDt, issCd를 시작으로 냅둬도됩니다.



즉 데이터가 아래와 같이,


usrId usrNm issSeq issDt issCd appDt canDt place
aaa001 홍길동 seq00002 20121026 20 20051027 20121026 전남
aaa002 이순신 seq00004 20121221 20 20061222 20121221 전남
aaa004 김홍동 seq00006 20121017 20 20061018 20121017 전남
aaa005 최자 seq00008 20121204 20 19981101 20121204 서울
aaa007 이미 seq00010 20060921 20 20010704 20060921 경남
aaa007 이미 seq00012 20120920 20 20060921 20120920 경남
aaa008 박호 seq00014 20120911 20 20060912 20120911 충남
aaa006 김길동 seq00016 20061005 20 20001006 20061005 경남
aaa006 김길동 seq00018 20121005 20 20061006 20121005 경남
aaa003 주최자 seq00020 20120906 20 20060907 20120906 부산
aaa003 주최자 seq00021 20120907 10 20120907   부산


데이터가 이렇게 나오게 할순없을까요?.

그리고, 특정날짜에 근무중이었던 사람을 조건으로 검색하는 방법이욤.

도저히 생각을 해봐도 답이 안나오네요.ㅠㅠ.


어떻게 해야 가능할지 ㅠ 힘드네욤~.. 고수님들 부탁드리겠습니당.

by 손님 [2012.09.11 18:47:25]

WITH TEST AS
(
SELECT 'aaa001' usrId,    '홍길동' usrNm,    'seq00001' issSeq,    '20051027' issDt,    '10' issCd,    '20051027' appDt,NULL canDt,'전남' place FROM DUAL
UNION ALL
SELECT 'aaa001',    '홍길동',    'seq00002',    '20121026',    '20',    NULL,'20121026'  ,'전남' FROM DUAL
UNION ALL
SELECT 'aaa002',    '이순신',    'seq00003',    '20061222',    '10',    '20061222',NULL ,'전남' FROM DUAL
UNION ALL
SELECT 'aaa002',    '이순신',    'seq00004',    '20121221',    '20',    NULL,'20121221'  ,'전남' FROM DUAL
UNION ALL
SELECT 'aaa004',    '김홍동',    'seq00005',    '20061018',    '10',    '20061018',NULL ,'전남' FROM DUAL
UNION ALL
SELECT 'aaa004',    '김홍동',    'seq00006',    '20121017',    '20',    NULL,'20121017'  ,'전남' FROM DUAL
UNION ALL
SELECT 'aaa005',    '최자 ', 'seq00007',    '19981101',    '10',    '19981101',NULL ,'서울' FROM DUAL
UNION ALL
SELECT 'aaa005',    '최자 ', 'seq00008',    '20121204',    '20',    NULL,'20121204'  ,'서울' FROM DUAL
UNION ALL
SELECT 'aaa007',    '이미 ', 'seq00009',    '20010704',    '10',    '20010704',NULL ,'경남' FROM DUAL
UNION ALL
SELECT 'aaa007',    '이미 ', 'seq00010',    '20060921',    '20',    NULL,'20060921'  ,'경남' FROM DUAL
UNION ALL
SELECT 'aaa007',    '이미 ', 'seq00011',    '20060921',    '10',    '20060921',NULL ,'경남' FROM DUAL
UNION ALL
SELECT 'aaa007',    '이미 ', 'seq00012',    '20120920',    '20',    NULL,'20120920'  ,'경남' FROM DUAL
UNION ALL
SELECT 'aaa008',    '박호 ', 'seq00013',    '20060912',    '10',    '20060912',NULL ,'충남' FROM DUAL
UNION ALL
SELECT 'aaa008',    '박호 ', 'seq00014',    '20120911',    '20',    NULL,'20120911'  ,'충남' FROM DUAL
UNION ALL
SELECT 'aaa006',    '김길동',    'seq00015',    '20001006',    '10',    '20001006',NULL ,'경남' FROM DUAL
UNION ALL
SELECT 'aaa006',    '김길동',    'seq00016',    '20061005',    '20',    NULL,'20061005'  ,'경남' FROM DUAL
UNION ALL
SELECT 'aaa006',    '김길동',    'seq00017',    '20061006',    '10',    '20061006',NULL ,'경남' FROM DUAL
UNION ALL
SELECT 'aaa006',    '김길동',    'seq00018',    '20121005',    '20',    NULL,'20121005'  ,'경남' FROM DUAL
UNION ALL
SELECT 'aaa003',    '주최자',    'seq00019',    '20060907',    '10',    '20060907',NULL ,'부산' FROM DUAL
UNION ALL
SELECT 'aaa003',    '주최자',    'seq00020',    '20120906',    '20',    NULL,'20120906'  ,'부산' FROM DUAL
UNION ALL
SELECT 'aaa003',    '주최자',    'seq00021',    '20120907',    '10',    '20120907',NULL ,'부산' FROM DUAL
)
SELECT *
FROM
(SELECT USRID,USRNM,ISSSEQ,ISSDT,ISSCD,
CASE WHEN APPDT IS NULL THEN LAG(APPDT) OVER(PARTITION BY USRID ORDER BY ISSSEQ ASC) ELSE APPDT END AS STARTDT ,
CASE WHEN CANDT IS NULL THEN LEAD(CANDT) OVER(PARTITION BY USRID ORDER BY ISSSEQ ASC) ELSE CANDT END AS ENDDT,
PLACE
    FROM TEST)
WHERE ISSCD='20' OR ENDDT IS NULL
ORDER BY ISSSEQ;

by 손님 [2012.09.12 14:10:38]
 SQL 문장 

by 손님 [2012.09.12 15:13:50]

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