connect by level -> mssql 0 0 4,868

by 티케 [SQLServer] connect by level [2012.10.12 20:32:44]



안녕하세요. 

oracle 에서 mssql(2008) 로 변경하고 있습니다.

그런데 connect by level 에서 어려움에 부딪혔고

검색신공으로 힌트를 얻어 어찌 어찌 안의 내용은 풀어 헤쳤는데
(with cte 계층쿼리를 만들어주는 것) 크아~!!!

ㅜ.ㅜ 쿼리는 아래와 같습니다.

--오라클 쿼리

SELECT
    (
    SELECT
  SUM(
  CASE WHEN TO_DATE(START_DT,'YYYYMMDD')+LV-1 <= TO_DATE(END_DT, 'YYYYMMDD')
  AND TO_CHAR(TO_DATE('20080123','YYYYMMDD')+LV-1,'DY') <> '토'
  AND TO_CHAR(TO_DATE('20080123','YYYYMMDD')+LV-1,'DY') <> '일'
  AND TO_CHAR(TO_DATE('20080123','YYYYMMDD')+LV-1,'DY') <> 'SAT'
  AND TO_CHAR(TO_DATE('20080123','YYYYMMDD')+LV-1,'DY') <> 'SUN'
THEN 1 ELSE 0 END
    )
FROM
    (
    SELECT LEVEL LV
    FROM DUAL
    CONNECT BY LEVEL<=TO_DATE('20091229','YYYYMMDD')-TO_DATE('20080123','YYYYMMDD')+1
    )
    ) - (SELECT COUNT(HOLIDAY) CNT FROM TB_HOLIDAY WHERE HOLIDAY BETWEEN START_DT AND END_DT )
    into wdate
    FROM DUAL;


--위 쿼리를 변경중인 mssql 쿼리


DECLARE @WDATE INT
 , @RET INT
 
 , @START_DT VARCHAR(8)
 , @END_DT VARCHAR(8)
 
 SET @START_DT = '20080123'
 SET @END_DT = '20091229';


 SELECT @WDATE = ((
   SELECT SUM(
   CASE WHEN CONVERT(SMALLDATETIME, @START_DT)+LV-1 <= CONVERT(SMALLDATETIME,@END_DT)
   AND TO_CHAR(CONVERT(SMALLDATETIME,@START_DT)+LV-1,'DY') <> '토'
   AND TO_CHAR(CONVERT(SMALLDATETIME,@START_DT)+LV-1,'DY') <> '일'
   AND TO_CHAR(CONVERT(SMALLDATETIME,@START_DT)+LV-1,'DY') <> 'SAT'
   AND TO_CHAR(CONVERT(SMALLDATETIME, @START_DT)+LV-1,'DY') <> 'SUN'
   THEN 1 ELSE 0 END
   )
   FROM(
--CONNECT BY LEVEL<=TO_DATE(@END_DT,'YYYYMMDD')-TO_DATE(@START_DT,'YYYYMMDD')+1
WITH CTE(LV) AS(
 SELECT 1 LV
 UNION ALL
 SELECT LV+1 FROM CTE WHERE  LV+1 <= DATEDIFF(DD, @START_DT, @END_DT)+1
)
SELECT * FROM CTE;
   ) A
 ) - (SELECT COUNT(HOLIDAY) AS CNT FROM TB_HOLIDAY WHERE HOLIDAY BETWEEN @START_DT AND @END_DT)
 )

크흑크흑 ㅠ 어렵네요.

조언부탁드립니다.

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