DB 구조
PK: 제품코드, 단가적용종료일
----------------------------------------------------------------------------------
제품코드 단가적용시작일 단가적용종료일 제품단가
------------------------------------------------------------------------------------
A001 2011.01.01 2012.12.31 100
A001 2013.01.01 9999.12.31 150
B001 2011.01.01 2012.12.31 100
B001 2012.01.01 9999.12.31 150
위와 같이 테이블에 DATA가 들어 있습니다.
그런데 파란파탕에 입력한것처림 단가적용시작일 과 단가적용종료일이 겹치는 부분이 존재하면
(겹치는 부분이란 예를들면 B001의 단가가 2013.01.01을 입력하여야 되는데 2012.01.01을 입력하여 2012.01.01~2012.12.31까지
B001의 단가가 100인지 150원인지 알수 없게 입력되어있습니다.)
저장시 스토어프로시즈나 트리거에서 체크하여 알려줄 로직을 만들려고 합니다.
그런데 어떻게 체크하여야 할지 ..아직 내공이 부족하여 고수님들 조언 부탁합니다.
Comment 3
-
하하하하하
2013.10.16 15:39
-
설까치
2013.10.16 15:46
답변 감사합니다. PK 내용을 잘못 표시하여 본분에 수정하였습니다.
-
건우아빠
2013.10.16 16:05
하하하하님 말씀 처럼 어플단에서 저장전에 체크 하시는게
이미 데이타가 들어 갔다면 ...
with
data as
(
select 'A001' [제품코드],'2011.01.01' [단가적용시작일] ,'2012.12.31' [단가적용종료일] ,100 [제품단가] union all
select 'A001' ,'2013.01.01' ,'9999.12.31' ,150 union all
select 'B001' ,'2011.01.01' ,'2012.12.31' ,100 union all
select 'B001' ,'2012.01.01' ,'9999.12.31' ,150 ) ,
res as
(
select *
, ROW_NUMBER() over (partition by 제품코드 order by [단가적용종료일] ) idx
from data )
select a.*
, b.단가적용종료일
, COALESCE( convert(varchar(10) , dateadd(dd,1,b.단가적용종료일), 102) , a.단가적용시작일 ) [신적용시작일]
from res a left join res b on a.제품코드 = b.제품코드 and a.idx = b.idx + 1
where a.단가적용시작일 <> COALESCE( convert(varchar(10) , dateadd(dd,1,b.단가적용종료일), 102) , a.단가적용시작일 )업데이트 루틴은 응용하시면 될듯 합니다.
잘못 된것 찾아서 적용...
저장하기전에
겹치는 제품코드가 있을때
입력받은 단가적용시작일이
겹치는 제품코드의 단가적용종료일보다 작은 날짜가 입력되면 튕기게 하면 될것 같은데
pk가 제품코드 한개인가요?