영업일구하기 함수 관련 문의드림니다. 0 10 2,060

by 충성 [SQL Query] [2016.11.29 19:26:05]


일단 휴일 관리하는 테이블이 별도로 있습니다.

 

select

(select

dt_wk --영업일

from h_calendar

where dt_cal = '20161122') -

(select

dt_wk --영업일

from h_calendar

where dt_cal = '20161101') 영업일,

(select

dt_wk --영업일

from h_calendar

where dt_cal = '20161130') -

(select

dt_wk --영업일

from h_calendar

where dt_cal = '20161101') 당월영업총일,

(select

dt_wk --영업일

from h_calendar

where dt_cal = '20161130') -

(select

dt_wk --영업일

from h_calendar

where dt_cal = '20161122') 남은영업일

from dual;

 

이렇게 하면 되기는 하나 이걸로 다시 계산이 들어가야 하는데 그러면 너무 지저분해져서 함수로 처리 하고 싶습니다.

 

H_CALENDAR 이 테이블이 휴일테이블인데

dt_cal 해당 컬럼은 일자가 들어가는 필드이고(yyyyMMdd)이런식으로

dt_wk 해당 컬럼은 워킹데이가 1 2 3 이런식으로 들어가고 있습니다 그리고 휴일일경우에는 1 2 3 3 이런식으로 워킹데이가 증가하지 않습니다.

fg_cal 해당 컬럼이 H가 오게 되면 휴일로 되어 dt_wk값이 증가 하지 않습니다.

 

select dt_cal,dt_ac_wk,fg_cal

from h_calendar

where fg_cal not in ('h')

 

이렇게 하면 휴일없이 나오는데...

 

 

고수님들의 조언부탁드립니다.

by 마농 [2016.11.29 20:11:18]

dt_wk 가 1,2,3,3 으로 증가하는데 기준이 어떻게 되나요?
  - 월 기준 초기화 인가요?
  - 연 기준 초기화 인가요?
  - 아니면 초기화 없이 증가만 하나요?
월기준 초기화 한다면?
  - 영업일과, 당월영업총일 구할 때 굳이 1일자의 값을 뺄 것이 아니라
  - 해당 일자(11/22)의 dt_wk 값만 구하면 될 것이구요.
매월 초기화 되는게 아니라면?
  - 비교일자 값을 빼는것은 맞지만 거기에 1 을 더해줘야 맞을 듯 하네요.
  - (11/22 의 값) - (11/1 의 값) + 1 AS 영업일
영업일 컬럼을 이용해 계산하는 방법도 있지만
  - 휴일 빼고 카운트 하는 방법도 있습니다.

-- 1. 매월 초기화 되어 1부터 시작하는 경우 --
SELECT MIN(DECODE(dt_cal, v_dt, dt_wk)) 영업일
     , MAX(dt_wk) 당월영업총일
     , MAX(dt_wk) - MIN(DECODE(dt_cal, v_dt, dt_wk)) 남은영업일
  FROM h_calendar
     , (SELECT '20161122' v_dt FROM dual)  -- 조회일자
 WHERE dt_cal LIKE SUBSTR(v_dt, 1, 6) || '%'
;
-- 2. 매월 초기화 되는 경우가 아닌 경우 --
SELECT MIN(DECODE(dt_cal, v_dt, dt_wk)) - MIN(dt_wk) + 1 영업일
     , MAX(dt_wk) - MIN(dt_wk) + 1 당월영업총일
     , MAX(dt_wk) - MIN(DECODE(dt_cal, v_dt, dt_wk)) 남은영업일
  FROM h_calendar
     , (SELECT '20161122' v_dt FROM dual)  -- 조회일자
 WHERE dt_cal LIKE SUBSTR(v_dt, 1, 6) || '%'
;
-- 3. Count 를 이용하는 방법
SELECT COUNT(CASE WHEN dt_cal <= v_dt THEN 1 END) 영업일
     , COUNT(*) 당월영업총일
     , COUNT(CASE WHEN dt_cal >  v_dt THEN 1 END) 남은영업일
  FROM h_calendar
     , (SELECT '20161122' v_dt FROM dual)  -- 조회일자
 WHERE dt_cal LIKE SUBSTR(v_dt, 1, 6) || '%'
   AND  fg_cal != 'h'
;

 


by 충성 [2016.11.30 09:14:41]

우왕 짱짱이네요....

궁금한게 있는데요

 

 FROM PR_PLANT_CALENDAR
     , (SELECT '20161122' V_DT FROM DUAL)  -- 조회일자
이부분에서 from 에서 ,찍고 하는건 레프트조인인가요 이너조인인가요?

오라클을 많이 안해봐서요....

 

그리고 굳이 그렇게 안해도 그냥 웨어절에서 파라미터 값을 넣어도 될것 같은데

저렇게 하는 이유가 뭔가요

가독성같은데 더 좋은건가요

 

잘 몰라서 질문드립니다.

 

아 다시보니 의미를 알겠네요.....

 

달을 잘라서 하느라고 그렇게 처리가 되었네요...

 

감사합니다.

 

 


by 마농 [2016.11.30 09:25:41]

From절에서 , 찍고 조인될 테이블들을 나열합니다.
  - 어떤 조인(outer, inner) 일지는 Where 절의 조인조건에 따라 결정됩니다.
  - 참고로 오라클에서는 아우터 조인시 (+) 기호를 이용합니다.


파라미터를 바로 써도 되는데 굳이 위와 같이 한 이유는
  - 해당 파라미터가 여러번 사용되기 때문입니다.
  - 여러번 바인딩 되는것을 한번만 바인딩 되도록 한 것입니다.
  - 동일값을 여러번 바인딩 하다보면 프로그래밍 실수가 나올 확율이 높아지죠.
  - 가독성 문제도 있구요.


by 마농 [2016.11.30 10:12:08]

기존 쿼리를 올려주세요.

샘플 데이터 예제도 있으면 좋구요.


by 마농 [2016.11.30 10:35:57]

서브쿼리로 하셔야 할 듯 한데요.

dt_wk 가 1로 초기화 되는 시점도 얘기 안해주셨네요.

각 테이블의 관계가 어떻게 되나요? 1:1 , 1:n

조건절엔 뭐가 들어갈까요?


by 마농 [2016.11.30 10:49:23]

너무 쉽게 간단하게 얘기하시네요.

저는 테이블을 볼수 없는 아무것도 모르는 제 3자입니다.

 

기준일자 조건은 어느테이블의 어느 컬럼에 주나요?

테이블간의 관계는 어떻게 되나요?


by 마농 [2016.11.30 11:09:58]

테이블간의 관계를 알아야 합니다.

왜 Group By SUM 을 하는지를 파악해야 하기 때문입니다.

관계에 대한 설명이 어려우면 각 테이블의 PK 를 알려주세요.

 

PL 테이블은 사용되지도 않으면서 조인이 되고 있구요.

QT_PO_MM 컬럼은 어느 테이블의 컬럼인지 알 수 없구요.

LEFT 조인 일색인데 왜 LEFT 조인하는지도 궁금하네요.

INNER JOIN 이 필요한데도 습관적으로 LEFT 사용하는 경우가 많더군요.


by 마농 [2016.11.30 11:26:33]

위 설명으론 group By Sum 이 잘못된 것으로 보입니다.

다 : 다 로 연결되어 Sum 한게 아닐까? 생각되네요.

각 테이블의 PK 를 알려주세요.

 

현재고로부터 월말재고를 예측하는 듯 한데요?

기준일자라는게 그냥 현재일자가 아닐까 생각되네요.

기준일자가 과거일자라면? 위 쿼리는 의미가 없는게 아닐런지?

과거일자가 유효하려면 기타 테이블에도 날짜나 월 조건이 포함되어야 할 듯 하네요.


by 마농 [2016.12.01 08:50:25]

캐면 캘수록 궁금증이 해결되는게 아니라 의구심만 커집니다.
1. PLAN_TYPE 항목은 처음 등장하는데요?
  - 어떤 역할일까요? 쿼리에서는 전혀 사용이 안되고 있는데요?
  - PK에 포함되어 있는데 사용이 안되는 이유가?
2. 주거래처 항목이 PK 에 포함되는게 맞나요?
3. PU_POL 과 MM_QTIO 에는
  - PK 에 CD_PLANT, CD_ITEM 이 없네요?


테이블들의 정보와 관계를 파악하기 어렵네요.
이 상태로는 도움 드리기가 어렵습니다.


by 충성 [2016.12.05 10:20:10]

넵 아뭍은 감사합니다.

 

제 아래 뎃글을 삭제좀 했습니다.

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