A테이블의 정보로 그룹코드 구해서 B테이블에 데이터 생성을 해야 되는데 제 머리가 딸립니다 ㅠㅠ 1 12 379

by 메로나 [2021.11.09 10:44:14]


테이블 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 먹여야 되나 싶어 해보는데 잘 안되네요...

by 마농 [2021.11.09 10:58:53]

B 테이블에 순번이 따라와야 하지 않나요?


by 메로나 [2021.11.09 11:14:50]

TB에는 그룹코드와 그룹내번호가 TA로 부터 계산되어서오구요 

취소하면 해당 PO_NO 대해서 순번안따지고 모조리 다 TA테이블에  N처리 됩니다.

예를들어 PP_2취소하면 PP_2는 모조리 취소되는겁니다

 


by 마농 [2021.11.09 11:30:44]

seq 를 안가져 올거면 굳이 왜 똑같은 건수의 레코드를 생성하나요?
그룹코드 당 일련번호 없이 1건씩만 만들어 내면 되는 것 아닌가요?
게다가, po_no 전체를 취소한다면? 같은 po_no 를 99개 단위로 그룹을 굳이 나누는지?


by 메로나 [2021.11.09 11:39:58]

취소는 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로 되어야 되는건데 

ㅠㅠ 죄송합니다 머리도 잘 안돌아가는데 설명도 깔끔히 못드려서 구구절절 ㅠㅠ


by 마농 [2021.11.09 12:34:28]

그러니까 이해가 안가는거죠.
그룹 순번을 만드는 과정이 이햐가 안간다는게 아니라
왜 이렇게 만들어야 하는지가 이해가 안가요.
seq 를 기준으로 자료를 만드는데 seq 는 저장을 안한다는게 이상한 거죠.
seq 를 저장하니 않는데 이런 자료가 무슨 의미가 있는지?
아런 자료를 왜 만드는지?
이렇게 만든 b 테이블을 어디에 활용하는지?


by 메로나 [2021.11.09 12:51:34]

ㅠㅠ 고객사(갑)의 요청이라고 해서요... 받은 스펙에 순번을 보내면 되는게 아니고 지들의 입맛에 맞게 룰이 짜져 있어서

그렇습니다...그냥 저도 순번만 줬으면 좋겠는데... 나머지 코드 빼 내는건 지들이 그 순번갖고 하면 될것을... 요청이 오네요

고객사 이니 안해줄 수도 없고...ㅜㅜ 머리는 안돌아가고

(그룹묶어서 RANK도 써보고 하는데 쿼리는 길고 길어지네요;;; 코드는 아스키로 어케변환해서 RANK값으로 해보고 있습니다)


by 마농 [2021.11.09 13:03:43]

제 말은 그룹내 순번을 원래의 순번으로 대체해야 한다는게 아니라
그룹내 순번과 별개로 원래의 순번도 추가 항목으로 존재해야 하지 않냐는 거죠.
A 를 기준으로 B 를 만들었다면? 이 두 테이블 사이에 연결고리가 있어야 하는데.
그게 없어서 의아해서 질문드리는 거에요.

보여주신 샘플을 보면
A 의 키가 (PO_NO + 순번) 인 것으로 판단이 되는데
A 를 기준으로 B 를 만들어 낸다면 그 키인 (PO_NO + 순번)이 상속되어야 할 것 같은데
그렇지 않아서 이상해서 질문드리는 것입니다.


by 메로나 [2021.11.09 13:33:36]

아... 아 이런 바보  >..< B에 TA에 PO_NO 순번이 키니 기 기준으로 만든 TB에도 TA의 순번이 있어야 된다 이말씀이시죠?^^;;; 네네 죄송합니다 이해력이 딸립니다 (>..<);;;


by 마농 [2021.11.09 13:44:41]

일단 요청하신 쿼리를 만들어 드릴 수는 있지만...
이게 과연 올바른 방법인가 의심이 되어 쿼리를 알려드리기가 꺼려지는 부분이 있습니다.
뭔가 설계가 잘못된게 아닐까? 생각이 되어 알려드리기가 조심스럽습니다.
요청 내용이 수긍이 가야 작업을 시원하게 할텐데
찝찝한 마음으로 작업을 하고 싶지가 않아서 그렇습니다.

찜찜하지만 일단 올려봅니다.

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'
        )
;

 


by 메로나 [2021.11.09 14:21:04]

아 마농님 이거 맞습니다. 이거 뒤에 말씀하신 순번도 있어야 된다고 하네요. 제가 설명을 제대로 못한 점 죄송합니다.

SELECT ROW_NUMBER() OVER(PARTITION BY po_no ORDER BY seq

이거까진 했는데 그 이후 전 감도 전혀 못잡겠던데... 마지막 SELECT에 쓰신 것 보고 Fire Egg를 탁 쳤습니다.

오늘도 이 쿼리 보며 진짜 반성에 반성을 해보며 감탄합니다.

감사합니다. (ㅠㅠ)b 최고입니다!!!


by 마농 [2021.11.09 14:42:49]

그룹을 A B C 순서로 만들게 되면 Z 까지는 가능한 그룹이 26개 밖에 안됩니다.
26개 그룹 이후에 대한 방안이 있는지 의문이네요.


by 메로나 [2021.11.09 15:46:06]

하루에 그만큼 처리할 일이 없다고 하네요 많아봤자 F까지도 안갈거라고 합니다~ ^^

감사합니다~~~

핵심 부분 3줄 보면 볼 수록 놀라울 뿐입니다. 아무리 생각해도 전 생각이 안나더라구요 ㅠㅠ 경험과 공부부족이네요

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