3일째 이문제 하나 가지고 머리 쥐어 뜯고 있습니다.
이게 해결되야 다른 업무에 적용해서 계속
진행되는데...흠...ㅡㅡ^
아래와 같은 테이블이 하나 있습니다.
테이블 명은 TEST
CODE CODE_NAME LEV START_A START_B END_A
END_B
---------------------------------------------------------
1001 AAA-1 10 81 1
99 4
1001 AAA-2 10 81 2
99 4
1001 AAA-3 10 81 3
99 4
1001 AAA-4 10 81 4
99 4
1001 AAA-5 10 82 2
99 4
1001 AAA-6 10 82 4
99 4
2001 BBB-1 20 82 1
99 4
2001 BBB-2 20 80 4
99 4
3001 CCC-1 30 83 3
99 4
3001 CCC-2 30 82 2
99 4
PK 는 CODE,START_A,START_B 입니다.
즉 위3개가 조합해서 하나의 PK가 되는 것입니다.
START_A는 1~99의 값을 가지고 START_B는 1-4의 값을 가집니다.
즉, START_A는 어떤 프로젝트의 시작 번호이고 START_B는 분기를
나타냅니다.
검색 조건은 START_A, START_B입니다.
예를 들어 START_A 가 81 이고 START_B가 2 이면 각각의 CODE에서
제일 가깝거나 같은 값들이 하나식 출력하게 만드는 겁니다.
즉 현재 입력받은 값(START_A와START_B)들의 같거나 최근 과거 값들을
출력하고
해당 CODE에 과거의 값들이 없으면 그 CODE는 출력 하지
않습니다.
즉 START_A가 81이고 START_B가 2일 경우 출력 값은
CODE CODE_NAME LEV START_A START_B END_A
END_B
-----------------------------------------------------------------------
1001 AAA-2 10 81 2
99 4
2001 BBB-2 20 80 4
99 4
위와 같이 출력 되게 하는것입니다
1001 코드는 81, 2에 해당되는 코드가 있어서 출력 되었고
2001 코드는 가장 가까운 80, 4가 출력 되었고
3001 코드는 81, 2 보다 작은 값들이 없으므로 출력 되지
않았습니다.
먼저 입력 받은 START_A 값보다 같거나 작은 값들의 최대 값들의
집합을 구하고
그 집합 안에서 입력 받은 START_B 보다 같거나 작은 최대값을 구해야
하는데
만약 START_B에 같거나 최대값이 없으면 START_A의 최대값보다 적은
값에서
값을 찾아야 합니다.
무슨 말인고 하니 입력 받은 값이 81과 3 인데 만약 4001 코드
값엔
80,4 와 81,4 가 있으면 80,4 가 출력 되게 해야 한다는 것인데 제가
짠 쿼리문은
자꾸 81,4를 출력 합니다...ㅡㅡ^
즉 이경우는 START_A의 최대값의 집합에서 값을 찾다보니 이런 출력이
나오는데
이거 어떻게 해결 할 방법 없는지요...
다른 분의 도움으로 오라클의 LPAD 함수를 사용하여 아래와 같이
해결했는데
문제는 제가 사용하는 디비가 DB2라서 오라클에서 지원하는 함수와
틀리다는 것입니다.
DB2에서는 이 문제를 어떻게 해결해야 하는지...
-------------------------------------------------------------------------
SELECT code, code_name, lev, start_a, start_b, end_a, end_b
FROM (SELECT a.*,
ROW_NUMBER() OVER(PARTITION BY code
ORDER BY start_a DESC, start_b DESC) no
FROM TEST a
WHERE LPAD(a.start_a,2,'0') || a.start_b
<= LPAD(:asStart_a,2,'0') || :asStart_b
)
WHERE no = 1
|