테이블 TA
PO_NO 순번 처리여부
PP_1 1 N
PP_1 2 N
PP_1 3 N
PP_1 ........... N
PP_1 99 N
PP_1 100 N
PP_1 101 N
PP_2 1 N
PP_2 2 N
PP_2 3 N
PP_2 ........... N
PP_2 52 N
PP_3 1 N
PP_3 2 N
PP_3 3 N
PP_3 4 N
PP_3 5 N
PP_3 6 N
에 이렇게 데이터가 있습니다. 뿅뿅버튼을 누르면 TA 테이블에 있는 처리여부가 N인것에 대해서 TB라는 테이블에 번호를 먹여서 코드르 따서 넣어야 됩니다.
99번까지가 MAX 이고요. 99번이 넘어가면 그룹코드가 다음 영문자로 되어야 됩니다. 그룹코드기준 PO에 대한 번호가 존재할 시 다른 PO번호애 대한건
또 그다음 영문자가 되어야 됩니다.
그룹코드 그룹내번호 PO_NO
A 1 PP_1
A 2 PP_1
A 3 PP_1
A ........... PP_1
A 99 PP_1
B 1 PP_1
B 2 PP_1
C 1 PP_2
C 2 PP_2
C 3 PP_2
C ........... PP_2
C 52 PP_2
D 1 PP_3
D 2 PP_3
D 3 PP_3
D 4 PP_3
D 5 PP_3
D 6 PP_3
이런식으로 되어야 됩니다. 그리고 처리된 해당 TA테이블의 처리여부는 플래그가 처리후 프로시저 마지막 단에서 UPDATE문으로 Y로 바뀔 것입니다.
만약 PP_2를 취소처리하면 TA에서 플래그가 다시 N으로 바뀔 것이구요. TB테이블에서는 해당 PO_NO를 DELETE문으로 지울 것입니다.
다시 뿅뿅버튼을 누르면 N인것만 뽑아올 것이고, 이때는 마지막에 그룹코드 이후가 되어야 됩니다.
그룹코드 그룹내번호 PO_NO
A 1 PP_1
A 2 PP_1
A 3 PP_1
A ........... PP_1
A 99 PP_1
B 1 PP_1
B 2 PP_1
D 1 PP_3
D 2 PP_3
D 3 PP_3
D 4 PP_3
D 5 PP_3
D 6 PP_3
E 1 PP_2
E 2 PP_2
E 3 PP_2
E ........... PP_2
E 52 PP_2
TA의 N인 정보를 모아다가 TB에 넣을 때 TB의 그룹코드도 봐야 될 것 같고... 그룹으로 RANK 먹여야 되나 싶어 해보는데 잘 안되네요...
취소는 po_no 단위로 할 수 있고요.. 특정po_no에 대해서 TA의 순번은 99가 넘어갈 수도 있습니다 110이 될 수도 150이 될 수도...
하지만 TB에 갈 때는 TA po_no에 대한 순번을 가지고 (그룹코드와 그룹내번호)를 만들어내야 됩니다.
그룹코드와 그룹내순번(99번이 넘어가면 그룹코드가 다음 영문자로 바뀜)
TA에서 특정 PO번호가 만약 110 이 된다고 하면, TB에 들어갈 때는
A 1
A 2
A 3
...
A 99
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
B 9
B 10
B 11
그 이후의 다른PO번호에 대해서는 코드가 C 1부터 생성되어야 됩니다...
목적은 TA에 순번을 가지고 TB의 (그룹코드와 그룹내순번) 을 새로 만드는겁니다.
TA에 순번 => TB에 (그룹코드, 그룹내순번)
기존에 만약 TB에 그룹코드가 존재하면 다음번은 그룹코드가 새로 따져야 되는건데
TB에 그룹코드가 C 50번까지 만들어져 있다면 다음 들어올것은 C 51번 부터가 아니라 D 1로 되어야 되는건데
ㅠㅠ 죄송합니다 머리도 잘 안돌아가는데 설명도 깔끔히 못드려서 구구절절 ㅠㅠ
일단 요청하신 쿼리를 만들어 드릴 수는 있지만...
이게 과연 올바른 방법인가 의심이 되어 쿼리를 알려드리기가 꺼려지는 부분이 있습니다.
뭔가 설계가 잘못된게 아닐까? 생각이 되어 알려드리기가 조심스럽습니다.
요청 내용이 수긍이 가야 작업을 시원하게 할텐데
찝찝한 마음으로 작업을 하고 싶지가 않아서 그렇습니다.
찜찜하지만 일단 올려봅니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | WITH ta AS ( -- 테스트용 샘플 자료 -- SELECT po_no, seq, yn FROM ( SELECT 'PP_1' po_no, 101 last_seq, 'N' yn FROM dual UNION ALL SELECT 'PP_2' , 52, 'N' FROM dual UNION ALL SELECT 'PP_3' , 6, 'N' FROM dual ) , ( SELECT LEVEL seq FROM dual CONNECT BY LEVEL <= 101) WHERE seq <= last_seq ) , tb AS ( SELECT 'A' grp_cd, 1 grp_seq, 'PP_1' po_no, 1 seq FROM dual WHERE 1=2 --UNION ALL SELECT 'D', 1, 'PP_3', 1 FROM dual WHERE 1=1 ) SELECT CHR( ( SELECT NVL(ASCII( MAX (grp_cd)), 64) FROM tb) + DENSE_RANK() OVER( ORDER BY po_no, CEIL(rn / 99)) ) grp_cd , MOD(rn - 1, 99) + 1 grp_seq , po_no , seq -- 순번이 추가되어야 한다고 생각함. FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY po_no ORDER BY seq) rn , po_no , seq FROM ta WHERE yn = 'N' ) ; |