질문있습니다~급합니다ㅠ 0 8 2,034

by 겨울이불 [SQL Query] [2013.08.22 12:18:15]



이런데이터가있습니다.

표1.(항목별 이력조회)

순번

적용아이템

변경전값

변경후값

적용시작일

적용확정일

560

insrd_cd

 

2222222

20130903

20130820

560

insrd_nm

 

노태자

20130903

20130820

560

insrd_rlatn

 

02

20130903

20130820

560

join_yn

 

1

20130903

20130820

561

insrd_cd

2222222

2222223

20130903

20130820

563

insrd_nm

노태자

노태순

20130903

20130820

568

insrd_cd

2222223

2222224

20130930

20130821

568

insrd_nm

노태순

남태순

20130930

20130821

567

insrd_cd

2222223

 

20131115

20130821

567

insrd_nm

노태순

 

20131115

20130821

567

insrd_rlatn

02

 

20131115

20130821

567

join_yn

1

 

20131115

20130821




표2.(결과 이력조회)

이름

고객ID

코드

적용기간

적용확정일

노태순

2222223

02

20130903 ~ 20130930

20130820

남태순

2222224

02

20130930 ~ 20131115

20130821

이런데이터가있습니다.   
표1의 값을가지고 표2의 값을 도출하는 해야합니다~


~필드설명을 드리자면..
* 순번 : 아이템이 변경될때마다..순서대로 증강하는값
* 적용아이템 : 변경할 아이템항목 insrd_cd(고객ID), insrd_nm(이름), insrd_rlatn(코드), join_yn(가입여부)
* 변경전 값  : 변경하기전에 최종값
* 변경후 값  : 변경된후의  값
* 적용기준일 : 적용아이템이  변경전값->변경후값으로 적용되는 일자
* 적용확정일 : 적용아이템의 값을 변경하는 일자


~적용시작일기준으로
insrd_cd 나 join_yn 가 변경될때마다...변경된이력을 만들고자합니다.

insrd_nm 나 insrd_rlatn 는  변경될때 이력으로 생기진 않지만..
insrd_cd 나 join_yn 가 변경되서 이력으로 만들어될때 순번 기준으로 최신정보로 보여줘야합니다.

그리고 같은적용기간에  insrd_cd 나 join_yn 는 이력으로 중복되지 않아야하고 최종으로 가져와야합니다.(같은 적용기간에 두번이상 중복된 이력은 안됩니다)
그리고 같은 적용시작일에 join_yn 가 짝수이면... 미가입된것이므로(예:가입->미가입, 가입->미가입->가입->미가입) 해당적용일자건들은 이력에 안남아야하겠죠....그치만..그해당일자는 적용종료일이 될것입니다...

참고로 ~ 변경전값이 없고 변경후값이 있는건 가입,  변경전값이 있고 변경후값이 없는건 미가입 한다는 의미입니다.
그리고 위에 표1의   join_yn =1 이면 가입이고, 값이 없으면 미가입이되는겁니다.
   가입/미가입시  insrd_cd, insrd_nm, insrd_rlatn, join_yn가  다같이 한꺼번에 변경됩니다.
~

표1 의 적용시작일은 꼭현재가아니더라도 과거 미래 왔다갔다 적용되어서 들어갈수있습니다.
  (유동적으로 들어갈껏을 대비하여 짜주시면..감사하겠습니다..)


자바로직으로 구현하려다가 도저히 머리가아파서...sql로 짤수있는방법이있는지 여쭙니다.ㅠ.. 안되면 자바로직으로 라도 메일로 부탁드립니다~(메일주소:kyuul@naver.com)

by 마농 [2013.08.22 13:05:53]

엑셀 작업 후 복사해서 붙여넣기


by 겨울이불 [2013.08.22 13:12:51]

ㅋ워드로 작성을 하니까 되네요..ㅠ생각이 짧았어요.ㅠ
표로 다시올렸습니다~

by 마농 [2013.08.22 13:20:20]
데이터가 이상해요.
마지막 순번 567 의 자료가 왜? (23, 노태순)인가요? (24, 남태순)이어야 하는것 아닌가요?

by 겨울이불 [2013.08.22 13:27:43]
아..그건..순번을 보시면...20131115일부로~ 미가입한것이 순번이 더빨릅니다.
그래서 563순번의 최종값으로 가져온것이구요..

내용은..

568순번은 20131115일이후로 ~ 미가입처리된것이고..

567순번은  20130930일부터  바뀐 이름하고 고객ID로 적용된것입니다.

위에말씀드린봐와같이..미래일자와 과거일자를 왔다가갔다하면서..수정,미가입, 가입을 날짜구간별로 할수있는 상황입니다...ㅠㅠ그래서 더복잡한듯하네요~~


by 마농 [2013.08.22 13:40:16]
아 순번이 뒤바뀌어 있었군요... 그래도 좀 이상해요.
입력 순서가 뒤바뀐 것 같아요.
적용시작일에 맞게 입력해야 적용이 쉬울 듯 합니다.
그게 안된다면 중간에 이력을 삽입하는 경우에는 앞뒤 데이터를 바꿔줘야 하지 않을까요?
적용시작일과 순번이 뒤바뀌면 적용하기 어려울 것같아요.

또 한가지 지금 예시 자료는 한사람의 변경이력인데요. 한사람만 있지는 않을 듯 하구요.
여러사람 있을 때 한사람의 자료만 구별해낼 키가 존재하는지?
키가 있으면 좋겠구요.
없다면 변경 전후 데이터로 추적을 해야 할텐데..
이럴려면 반드시 키가 될 수 있는 insrd_cd 는 항상 입력이 되어야 하는데
순번 563을 보면 이게 없습니다. 이름만으로는 추적이 불가능하죠. 동명이인도 있을테고

by 겨울이불 [2013.08.22 13:53:51]
결론적으로 중간날짜에 이력이 들어가면..순번하고 적용시작일의 순차가다르면...힘들다는 말씀이신가요?ㅠㅠ
표1을 순번으로 정렬은가능하지만..얘기 들어보니.. 순번으로 정렬해도 안된다는 말씀같은데;;~

순번은..그냥 날짜와상관없이..적용하는 순번이고..적용시작일은 언제부터 적용하겠다고 하는 적용시점이기때문에..같이가져갈수는 없는 상황입니다.ㅠ
다른방법이..없을까요? 혹시 표1조회값에서..어떤값이 필요한지 말씀해주세요~


그리고~ 표1.조회시 유일키값을가져와서 조회하기때문에  1명에대한 값을 조회 합니다.

by 마농 [2013.08.22 14:18:34]
-- 데이터를 추적해 나가야 하는 경우에 어렵다는 거구요.
-- 한사람을 구별해낼 유일키가 존재한다면 어렵지 않을 듯 하네요.
WITH t AS
(
SELECT 0 seq, 0 id, '' item, '' v1, '' v2, '' sdt, '' rdt FROM dual WHERE 1=2
UNION ALL SELECT 560, 1, 'insrd_cd',        '', '2222222', '20130903', '20130820' FROM dual
UNION ALL SELECT 560, 1, 'insrd_nm',        '',  '노태자', '20130903', '20130820' FROM dual
UNION ALL SELECT 560, 1, 'insrd_rlatn',     '',      '02', '20130903', '20130820' FROM dual
UNION ALL SELECT 560, 1, 'join_yn' ,        '',       '1', '20130903', '20130820' FROM dual
UNION ALL SELECT 561, 1, 'insrd_cd', '2222222', '2222223', '20130903', '20130820' FROM dual
UNION ALL SELECT 563, 1, 'insrd_nm',  '노태자',  '노태순', '20130903', '20130820' FROM dual
UNION ALL SELECT 568, 1, 'insrd_cd', '2222223', '2222224', '20130930', '20130821' FROM dual
UNION ALL SELECT 568, 1, 'insrd_nm',  '노태순',  '남태순', '20130930', '20130821' FROM dual
UNION ALL SELECT 567, 1, 'insrd_cd', '2222223',        '', '20131115', '20130821' FROM dual
UNION ALL SELECT 567, 1, 'insrd_nm',  '노태순',        '', '20131115', '20130821' FROM dual
UNION ALL SELECT 567, 1, 'insrd_rlatn',   '02',        '', '20131115', '20130821' FROM dual
UNION ALL SELECT 567, 1, 'join_yn' ,       '1',        '', '20131115', '20130821' FROM dual
)
SELECT MIN(insrd_cd   ) KEEP(DENSE_RANK LAST ORDER BY seq) insrd_cd
     , MIN(insrd_nm   ) KEEP(DENSE_RANK LAST ORDER BY seq) insrd_nm
     , MIN(insrd_rlatn) KEEP(DENSE_RANK LAST ORDER BY seq) insrd_rlatn
     , sdt
     , MAX(edt) edt
     , MAX(rdt) rdt
  FROM (SELECT seq
             , LAST_VALUE(MIN(DECODE(item, 'insrd_cd', v2))
               IGNORE NULLS) OVER(ORDER BY sdt, seq) insrd_cd
             , LAST_VALUE(MIN(DECODE(item, 'insrd_nm', v2))
               IGNORE NULLS) OVER(ORDER BY sdt, seq) insrd_nm
             , LAST_VALUE(MIN(DECODE(item, 'insrd_rlatn', v2))
               IGNORE NULLS) OVER(ORDER BY sdt, seq) insrd_rlatn
             , MAX(DECODE(item, 'join_yn', v1, '0')) join_yn
             , sdt
             , LEAD(sdt) OVER(ORDER BY sdt, seq) edt
             , rdt
          FROM t
         WHERE id = 1
         GROUP BY seq, sdt, rdt
        )
 WHERE join_yn = '0'
 GROUP BY sdt
 ORDER BY sdt
;

by 겨울이불 [2013.08.22 15:19:18]
정말감사합니다...~

보내주신쿼리를 검토해봤는데..
insrd_nm 나 insrd_rlatn  가 변경되어도 이력으로 발생하는거 맞죠?

제가 글을올릴땐..insrd_nm 나 insrd_rlatn  가 변경됬을때 이력으로 발생안되게끔 해달라고 올렸었는데
생각해보니..모든값이 수정되어도 ~이력으로 발생되는게 더낳을듯하네요~

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