해당하는 항목만 조회 하기 0 7 1,969

by xcrew postgresql [2023.10.30 16:42:48]


안녕하세요.

한달에 한번 실행되는 스케줄에 해당하는 항목들을 가져오려고 합니다.
postgresql이고 도움 부탁드립니다.

order_id = 주문번호, use_term=사용개월 , pay_success_ts=결제일, reg_ts=생성일, start_dy=이용시작일, expiration_dy=이용종료일 입니다.

SELECT order_id, use_term, pay_success_ts, reg_ts, start_dy, expiration_dy 
FROM tb_strg_order01m a
WHERE a.pay_gubun = 'P'
AND a.pay_std = 'success'
AND to_date(a.expiration_dy, 'YYYYMMDD') > to_date(to_char('20231101'::date, 'YYYYMMDD'), 'YYYYMMDD')
AND use_term > '1'

조회 결과는 아래와 같습니다.

order_id use_term pay_success_ts reg_ts start_dy expiration_dy
224 6 2023-05-23 13:16:48.300 2023-05-23 13:16:48.304 20230525 20231124
235 6 2023-06-01 15:31:53.270 2023-06-01 15:31:53.273 20230601 20231201
450 3 2023-09-03 16:10:11.692 2023-09-03 16:10:11.696 20230909 20231208
72 12 2023-02-10 21:22:54.750 2023-02-10 21:22:54.755 20230211 20240210
416 3 2023-08-23 12:21:10.407 2023-08-23 12:21:10.411 20230825 20231124

현재월이 11월이라고 가정 했을때
이용시작일과 이용종료일에 포함된 데이터만 가져오면 되는데
order_id 224와 416은 이미 10월달에 결제가 되었을테니 빼고 가져와야  됩니다.
그래서 제가 원하는 데이터는 아래와 같습니다.

order_id use_term pay_success_ts reg_ts start_dy expiration_dy
235 6 2023-06-01 15:31:53.270 2023-06-01 15:31:53.273 20230601 20231201
450 3 2023-09-03 16:10:11.692 2023-09-03 16:10:11.696 20230909 20231208
72 12 2023-02-10 21:22:54.750 2023-02-10 21:22:54.755 20230211 20240210
           
           

도움 부탁드립니다.

by 우주민 [2023.10.30 16:50:51]

"order_id 224와 416은 이미 10월달에 결제가 되었을테니" 이 정보를 특정 지을 수 있는 컬럼이 혹시 있나요?

아니면 무조건 1달 전에 결제가 되는건가요?


by xcrew [2023.10.30 16:57:37]

특정 지을 수 있는 컬럼은 없습니다. use_term 6개월 짜리를 한달 한달 나눌려고 한다고 보시면 됩니다. ㅠㅠ
예를들어서 224의 경우 5월 부터 10월까지 6개월간의 정산은 이미 된 상태고 끝났으니 11월에는 나오면 안되는 겁니다.


 


by 우주민 [2023.10.30 17:29:42]

질문해 주신 내용을 정확하게 이해하지 못해 질문을 또 드리게 되네요....

답변해주신 224와 같이 235의 경우에도 이미 6월부터 12월까지 결제가 완료 되었다고 봐야하는거 아닐까요?


by 마농 [2023.10.30 17:30:42]

조회 대상 판별 기준을 정확하게 알려주셔야 합니다.
"224의 경우 5월 부터 10월까지 6개월간의 정산은 이미 된 상태고 끝났으니" 라고 하셨는데?
어떤 항목의 어떤 값을 기준으로 판별하신 것인지 값을 구체적으로 적어주세요.
예를 들면 (5월 부터 10월까지)가 6개월인 듯 하지만
일자까지 고려하면 (5월25일 ~ 11월24일)이 6개월입니다.


by xcrew [2023.10.31 08:20:25]

답변 감사합니다. 좀더 자세하게 설명 드려야 했는데 죄송합니다.

224의 경우 tb_strg_order01m 테이블은 이미 결제완료된 데이터만 있는 테이블 입니다.
use_term값이 6이면 6개월 치를 미리 결제완료 라고 생각하시면 될것같습니다.
그 6개월치를 1개월씩 나누어 다른 테이블에 저장하려고 합니다.

5월25일부터~11월24일이 6개월이 맞습니다.
현재 스케줄은 매달1일 한번만 돌아 갑니다.
그래서 월별로 1개월씩 조회된 데이터를 저장하려고 합니다.

224의 경우 5월25일은 결제일이니 제외하고

6월1일, 7월1일, 8월1일, 9월1일, 10월1일 이렇게 6개월 치를 1개월씩 만들려고 합니다.

설명이 부족하면 말씀해주세요. ㅠㅠ

그리고
AND a.expiration_dy >= '20231201' 이때에 같은 달인 12월은 제외 할 수 있는 방법이 있을까요?

답변 정말 감사드립니다.

 

 


by 마농 [2023.10.30 16:55:39]

1. 조회조건만 바꾸면 되는 것 아닌가요?
- 조회조건 : '20231101' -> '20231201'

2. 그리고 불필요한 함수 사용도 제거하면 좋을 듯 합니다.
- 조건절에서 사용된 함수들 제거 : to_char, to_date, ::date 등 전부 불필요
- AND a.expiration_dy >= '20231201'


by 마농 [2023.10.31 09:21:11]

결재 당월은 제외하고 나머지 5개월 아닌가요?
최초 질문에는 224 는 나오면 안되는 거였는데
최종 질문에는 224 는 5개 행으로 나와야 한다는 건가요?
최초 질문과 최종 질문이 전혀 다른데요?
원하는 결과표를 다시 한번 정리해서 올려주세요.
만약 최초 질문이 맞다면?
조회조건만 1개월 + 해서 주면 되는 아주 간단한거 아닌지? (바로 위 댓글)

   AND a.expiration_dy >= TO_CHAR('20231101'::DATE + INTERVAL '1' MONTH, 'yyyymmdd')

 

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