캘린더 마스터를 이용하여 년월주차, 주차의 마지막일자 구하기 0 8 1,150

by 잭키올 [2017.08.29 20:36:24]


1155.PNG (44,330Bytes)

안녕하세요.

구매오더의 SALES_DT 를 이용하여 
결과 테이블에 연월주(YMW_VAL), 주차의 마지막일자(YMW_DT)를 구하고 싶습니다.
현재 일자 기준의 당주와 차주까지의 데이터를 생성해야 합니다.

현재 해당하는 결과는 얻었으나, 같은 테이블을 여러번 조인하여 결과를 얻어서
다른 방법이 있는지 문의를 드리고 싶어 질문을 드렸습니다.


제가 작성한 쿼리를 아래와 같습니다.


번거로우시겠지만 답변 부탁드립니다.
감사합니다.

<수정된 쿼리>

SELECT A.PO_NO, A.YYYYWK AS YMW_VAL, B.CALD_DT AS YMW_DT, A.SALES_DT
  FROM (
        SELECT A.PO_NO, A.YYYYWK, A.SALES_DT
          FROM (
                SELECT A.PO_NO
                     , B.PLAN_YYYY_CD + B.PLAN_MM_CD + B.PLAN_WK_CD AS YYYYWK
                  FROM TB_CO_SALES A
                       INNER JOIN AD_CALD_MST B ON 1=1
                              AND B.CALD_DT = A.SALES_DT
               ) A
               INNER JOIN (
                           SELECT PLAN_YYYY_CD + PLAN_MM_CD + PLAN_WK_CD AS YYYYWK
                             FROM AD_CALD_MST 
                            WHERE CALD_DT BETWEEN CONVERT(NVARCHAR(8), GETDATE(), 112) AND CONVERT(NVARCHAR(8), GETDATE()+7, 112)
                            GROUP BY PLAN_YYYY_CD, PLAN_MM_CD, PLAN_WK_CD
                          ) B ON 1=1
                      AND B.YYYYWK = A.YYYYWK
       ) A
       INNER JOIN (
                   SELECT PLAN_YYYY_CD + PLAN_MM_CD + PLAN_WK_CD AS YYYYWK, MAX(CALD_DT) AS CALD_DT
                     FROM AD_CALD_MST 
                    GROUP BY PLAN_YYYY_CD, PLAN_MM_CD, PLAN_WK_CD
                  ) B ON 1=1
              AND A.YYYYWK = B.YYYYWK

 

by jkson [2017.08.30 08:41:30]

전반적으로 다 이상하네요.

테이블명이 TB_CO_SALES인거죠? TB_CO_PO가 아니고..

쿼리도 저대로 돌렸으면 오류가 났을 것 같고..

ALIAS C는 없는데 C를 썼고 두번째 나오는 SELECT절에서는 ALIAS가 없어요.

오류 안나게 수정했다고 하더라도 원하시는 결과는 안 나왔을 것 같네요.

원하시는 결과도 뭔가 이상하구요. YMW_DT 값이

SALES_YMW의 마지막 일자라고 하셨는데 SALES_YMW는 어디에서 온 것이며

만약 YYYYWK의 마지막 일자(CALD_DT)라고 하더라도 20170901는 나올 수가 없구요.

SALES_DT 는 판매일자라고 하셨는데 D의 판매일자는 20170903이네요..


by 잭키올 [2017.08.30 11:27:58]

죄송합니다. 쿼리와 이미지 교체하였습니다 ㅠㅠ


by 마농 [2017.08.30 10:11:43]

설명과 예시와 쿼리가 3위일체가 되어야 하는데...
3가지가 서로 전혀 일치하지 않네요.
각각 따로 따로 네요.


by 잭키올 [2017.08.30 11:28:03]

죄송합니다. 쿼리와 이미지 교체하였습니다 ㅠㅠ


by 마농 [2017.08.30 11:32:25]

주의 기간이 (일~토) 인 것을 이용해 풀면 되겠네요.

SELECT a.po_no
     , b.plan_yyyy_cd + b.plan_mm_cd + b.plan_wk_cd AS ymw_val -- 연월주
     , CONVERT(VARCHAR(8), b.cald_dt - datepart(w, b.cald_dt) + 7, 112) AS ymw_dt -- 토요일
     , a.sales_dt
  FROM tb_co_sales a
 INNER JOIN ad_cald_mst b
    ON a.sales_dt = b.cald_dt
 WHERE a.sales_dt >= CONVERT(VARCHAR(8), getdate() - datepart(w, getdate()) +  1, 112) -- 금주 일요일
   AND a.sales_dt <= CONVERT(VARCHAR(8), getdate() - datepart(w, getdate()) + 14, 112) -- 차주 토요일
;
SELECT a.po_no
     , b.ymw_val
     , b.ymw_dt
     , a.sales_dt
  FROM tb_co_sales a
 INNER JOIN
       (SELECT cald_dt
             , plan_yyyy_cd + plan_mm_cd + plan_wk_cd AS ymw_val
             , MAX(cald_dt) OVER(PARTITION BY plan_yyyy_cd, plan_mm_cd, plan_wk_cd) ymw_dt
          FROM ad_cald_mst
         WHERE cald_dt >= CONVERT(VARCHAR(8), getdate() - datepart(w, getdate()) +  1, 112)
           AND cald_dt <= CONVERT(VARCHAR(8), getdate() - datepart(w, getdate()) + 14, 112)
        ) b
    ON a.sales_dt = b.cald_dt
;

 


by 잭키올 [2017.08.30 12:54:30]

답변 감사드립니다.
제가 한 방법은 ad_cald_mst 를 이용해서 결과값을 
약간은 억지로(?) 도출하려고 한 거 같아 조인이 쓸데없이 많아 졌네요. 

WHERE cald_dt >= CONVERT(VARCHAR(8), getdate() - datepart(w, getdate()) +  1, 112)
  AND cald_dt <= CONVERT(VARCHAR(8), getdate() - datepart(w, getdate()) + 14, 112)

위 구문 잘 배워갑니다. 감사합니다. (__)(__)(__)


by jkson [2017.08.30 11:58:28]

실제 수행한 쿼리를 써주시면 좋을 것 같은데 편집하신 건가요?

수정하신 쿼리도 A.SALES_DT가 인라인뷰에 없어서 오류날 것 같은데..;

마농님 쿼리가 의도하신 쿼리 같은데 그렇다면 결과에 G도 추가되겠네요.


by 잭키올 [2017.08.30 12:44:02]

아.. 죄송합니다. 실제 수행한 쿼리를 편집하는 과정에서 인라인 뷰에 필드 하나가 빠진 것 같네요..

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