오라클의 경우 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의 셋팅에 따라 행제한이 걸리니, 필요한 업무에 따라 맞게끔 셋팅해줘야 할 필요성이 있다.
'DB > MsSql' 카테고리의 다른 글
[MSSQL] 구성 요소 'Ad Hoc Distributed Queries'이(가) SQL Server 보안 구성의 일부로 해제 오류 (0) | 2020.06.09 |
---|---|
테이블 컬럼 코멘트 및 정보 확인 SQL (0) | 2020.05.29 |
[MSSQL] try_convert 사용하여 지긋지긋한 형변환 에러를 탈출하자. (0) | 2020.04.14 |
[MSSQL] 해당 주차 가져오기 (0) | 2020.03.07 |
SQL Server 에이전트를 활용한 자동 백업 (0) | 2020.02.23 |