Row의 값에 따라 데이터 더 가져오기.. 1 8 744

by 동동동 [2019.04.29 17:42:21]


WITH TMP AS (
SELECT 1 SEQ, 1 ORG_SEQ, 'A' AS CODE, 5 AS TOT, 1 AS NUM, '20190401' AS DTE FROM DUAL UNION ALL
SELECT 2 SEQ, 1 ORG_SEQ, 'A' AS CODE, 5 AS TOT, 2 AS NUM, '20190402' AS DTE FROM DUAL UNION ALL
SELECT 3 SEQ, 1 ORG_SEQ, 'A' AS CODE, 5 AS TOT, 3 AS NUM, '20190403' AS DTE FROM DUAL UNION ALL
SELECT 4 SEQ, 1 ORG_SEQ, 'A' AS CODE, 5 AS TOT, 4 AS NUM, '20190404' AS DTE FROM DUAL UNION ALL
SELECT 5 SEQ, 1 ORG_SEQ, 'A' AS CODE, 5 AS TOT, 5 AS NUM, '20190405' AS DTE FROM DUAL UNION ALL
SELECT 6 SEQ, 6 ORG_SEQ, 'B' AS CODE, 2 AS TOT, 1 AS NUM, '20190401' AS DTE FROM DUAL UNION ALL
SELECT 7 SEQ, 6 ORG_SEQ, 'B' AS CODE, 2 AS TOT, 2 AS NUM, '20190402' AS DTE FROM DUAL UNION ALL
SELECT 8 SEQ, 8 ORG_SEQ, 'C' AS CODE, 1 AS TOT, 1 AS NUM, '20190401' AS DTE FROM DUAL UNION ALL
SELECT 9 SEQ, 9 ORG_SEQ, 'C' AS CODE, 1 AS TOT, 1 AS NUM, '20190403' AS DTE FROM DUAL
)
SELECT * FROM TMP;
 WHERE DTE = '20190401';

 

다음과 같이 데이타가 있을시 일자가 '20190401' 로 조회시 코드 A인 경우 TOT가 5 이므로 NUM이 5인 '20190405' 까지의 데이터를 더 가져오고,

B인 경우에는 TOT가 2 이므로 '20190402' 까지의 데이타를...C는 1이므로 '20190401 만 가져오고..

유일키는 SEQ이고 TOT가 풀어져서 원부모를 바라보게 되는키는 ORG_SEQ입니다.

 

 

이렇게 가져올수 있도록 쿼리가 가능할까요?

 

도움 부탁드립니다.

 

원하는 결과

CODE TOT NUM DTE
A 5 1 20190401
A 5 2 20190402
A 5 3 20190403
A 5 4 20190404
A 5 5 20190405
B 2 1 20190401
B 2 2 20190402
C 1 1 20190401

 

by 마농 [2019.04.29 20:01:32]

제시하신 조건이 뭔가 개연성이 부족해 보입니다.
조건은 항상 매월 1일 형태로 들어오나요? 1일이 아닌 다른 일자가 올 수도 있는지?
tot 와 num 과의 관계는 동일 월에서만 유효한 관계인 것인지? 월이 넘어가면서 연결되는 경우는 없는지?
이게 실제 테이블 자료인지? 가공된 중간 집합인지?
왜 이런 조건이 필요한건지?


by 동동동 [2019.04.29 21:06:31]

마농님 답글 감사드립니다.

쿼리를 수정했습니다.

 

유일키는 SEQ이고 TOT가 풀어져서 원부모를 바라보게 되는 키는 ORG_SEQ입니다.

 

특정 날짜를 검색해도 원래 SEQ와 풀어진 값들도 다 가져오게 하려고 하고 있습니다..

 


by 마농 [2019.04.29 22:16:01]

설명이 너무 인위적입니다. 자연스러운 설명 없나요?
테이블의 의미와 조건의 의미, 결과가 나오게 되는 이유 등을 모르겠네요.
TOT가 풀어져서 원부모를 바라보게 된다는게 도대체 뭔말인지?


by 동동동 [2019.04.29 22:40:30]

제가 설명을 잘 못하고 있네요....ㅠㅠ

TOT가 5 이면 5개의 Row가 반드시 생성되고

 그중 첫번째 Row부터 NUM 이 1씩 증가한 번호가 들어가게 되고,  일자도 1일씩 추가되게 됩니다.

풀린 5개의 Row는 NUM이 1일것의 SEQ를 바라보게 (ORG_SEQ) 됩니다.

SEQ는 PK입니다....

 


by 마농 [2019.04.29 23:08:53]

TOT가 5 이면 5개의 Row가 반드시 생성되고???
"생성"은 없는 걸 만든다는 의미인데?
원하는 게?
1건을 5건으로 부풀려 조회하는 건가요?
아니면 5건 있는 걸 그대로 조회하는 건가요?
이상태로 계속 질문을 바꿔 나가는 것으로는 답을 찾기 어려울 것 같은데요?


by 마농 [2019.04.30 08:34:44]

tot 와 num 을 이용해 조회하는게 맞나요?
seq 와 org_seq 의 계층 관계를 이용해 조회하면 되는게 아닌가 싶네요.
 

SELECT *
  FROM tmp
 START WITH dte = '20190401'
 CONNECT BY NOCYCLE PRIOR seq = org_seq
;

 


by 동동동 [2019.04.30 09:04:25]

마농님 답변 감사드립니다.

간단히 seq 와 org_seq 를 이용하면 될것을 제가 어렵게 생각하고 있었나 보네요..

제가 생각한 것은 DTE가 '20190401'이 되었든 '20190403' 이 되었든 A코드는 5Row가 있기 때문에 5Row를 다 가져오는 거였습니다..

 

답글 감사드립니다..

 


by 마농 [2019.04.30 16:56:37]
SELECT b.*
  FROM tmp a
     , tmp b
 WHERE a.dte = '20190403'
   AND a.org_seq = b.org_seq
;

 

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