본문으로 바로가기

오라클의 경우 CONNECT BY 구문을 이용하여 해결 가능하지만 MS의 경우에는 재귀함수를 통하여 트리구조 데이터를 만들어야 한다.

 

아래의 경우 입력받은 일자로 부터 140일까지의 데이터를 ROW로 변환하는 쿼리이다.

	DECLARE 
	 @V_S_DATE 	DATE
	,@V_E_DATE 	DATE
     SET @V_S_DATE = '20200101';
	 SET @V_E_DATE = DATEADD(DAY,140,@V_S_DATE); --현재일자의 140일+
	
	WITH CTE
		AS(
		SELECT DATEPART(WW, @V_S_DATE) AS WEEK
			 , @V_S_DATE AS DATE
			UNION ALL
       --반복을 통한 증감에 대한 구문을 여기서 선언한다.
		SELECT DATEPART(WW, DATEADD(DAY, +1, DATE)) AS WEEK
			  ,DATEADD(DAY, +1, DATE)
		FROM CTE
	   WHERE DATE < @V_E_DATE --WHERE조건에 따라서 ROW의 수가 달라진다.
		)
		
		SELECT 
		       DATE
			 , CONVERT(VARCHAR,DATEPART(YEAR,DATE))+'-'+CONVERT(VARCHAR,WEEK) AS  YEAR_WEEK  --년도-주차  
		  FROM CTE 
        --재귀함수 호출 횟수 제한 : 0일경우 무제한
		OPTION(MAXRECURSION 0)

 

OPTION의 경우 기재하지 않으면 MS의 셋팅에 따라 행제한이 걸리니, 필요한 업무에 따라 맞게끔 셋팅해줘야 할 필요성이 있다.