안녕하세요.
구매오더의 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
전반적으로 다 이상하네요.
테이블명이 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이네요..
주의 기간이 (일~토) 인 것을 이용해 풀면 되겠네요.
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 ;