기간 조회 쿼리 질문요... 0 6 4,091

by 미르 [SQLServer] [2012.01.13 16:02:16]


column1    column2    startdate    enddate
1 aaa 20120113    20120201
2 bbb 20111230    20120102
3 ccc 20120101    20120115
4 ddd 20120305    20120405
5 eee 20120131    20120301    

이런식으로 데이터가 존재하는 테이블에서요

startdate는 시작일 enddate는 종료일 일 때, 

시작일~종료일이 중복이 되는 컬럼을 다르게 만들고 싶어요

위 데이터로 생각한다면

column1 column2 startdate enddate    중복여부
1 aaa 20120113 20120201    Y
2 bbb 20110302 20120402    N
3 ccc 20120101 20120115    Y
4 ddd 20120405 20120505    N
5 eee 20120131 20120301 Y

1번과 3번은 중복되고, 1번과 5번도 기간이 중복되는 데이터가 존재하기에 중복여부에 Y로 표시하도록 하고 싶습니다.

오늘 아침부터 계속 생각하고 짜보고 했는데도 답이 안나오네요 
by 손님 [2012.01.13 18:13:23]
다른 방법이 있을지 모르겠지만.. 간단하게
with t as
(
select 'aaa' A , '20120113' startdate, '20120201' enddate from dual union all
select 'bbb' A , '20111230' startdate, '20120102' enddate from dual union all
select 'ccc' A , '20120101' startdate, '20120115' enddate from dual union all
select 'ddd' A , '20120305' startdate, '20120405' enddate from dual union all
select 'eee' A , '20120131' startdate, '20120301' enddate from dual
)
select A
, startdate, enddate
, isnull(( select top 1 'Y'
from t
where ta.A <> A
and (ta.startdate between startdate and enddate
or ta.enddate between startdate and enddate )
),'N') 중복여부
from t ta

by 미르 [2012.01.13 18:56:35]
와... 간단하게 나오네요;; isnull을 이용해서... 난 왜 그리 쓸데없이 길게 적은거지... ㅠ_ㅠ
고맙습니다! 역시 쿼리를 더 많이 짜봐야겠어요 ㅋ

by 마농 [2012.01.16 09:11:09]
위의 기간 중복체크는 정확하지 않습니다.
기간중복체크는 시작일과 종료일을 교차 비교하셔야 합니다.
AND startdate <= ta.enddate
AND enddate >= ta.startdate

by 미르 [2012.01.16 14:40:03]
between이랑 <=, >= 이것의 차이가 어떤거에요? 둘다 대소비교 아닌가요?

by 마농 [2012.01.16 15:34:08]
단순 between과 부등호의 차이를 말하는것이 아니구요.
두 구문의 의미가 다릅니다.

위의 구문은 시작일이나 종료일이 기간내에 있는 것을 찾는것인데요.
시작일과 종료일이 기간을 통째로 포함라는 경우는 찾질 못합니다.
그래서 정확하지 않다고 표현한 것입니다.

by 미르 [2012.01.16 16:38:23]
아! 20120101~20120501이랑 20120102~20120301 같은 경우 앞에 데이터가 중복이 아니라고 하네요! 감사합니다! Good!
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입