모든 공휴일을 저장하는 테이블을 기준으로 한 달 내의 근무일 수를 계산하는 쿼리가 있습니다.조건부 조사 On Row_Number
현재 출력은 공휴일과 토요일과 일요일을 제외한 모든 근무일을 표시하지만, 매월 표시하고 싶지만 공휴일이나 토요일이나 일요일에는 증가하지 않습니다.
조건부로 행 번호를 늘리는 방법이 있습니까?
쿼리는 다음과 같습니다 : 의사 코드의
DECLARE @startnum INT=0
DECLARE @endnum INT=365;
WITH gen AS
(
SELECT @startnum AS num
UNION ALL
SELECT num + 1
FROM gen
WHERE num + 1 <= @endnum
)
, holidays AS
(
SELECT CONVERT(DATE, transdate) AS HolidayDate
FROM WORKCALENDER w
WHERE w.CALENDARID = 'PubHoliday'
)
, allDays AS
(
SELECT DATEADD(d, num, CONVERT(DATE, '1 Jan 2016')) AS DateOfYear
, DATENAME(dw, DATEADD(d, num, CONVERT(DATE, '1 Jan 2016'))) AS [dayOfWeek]
FROM gen
)
select number = ROW_NUMBER() OVER (ORDER BY DateOfYear )
, *
from allDays
LEFT OUTER JOIN holidays
ON allDays.DateOfYear = holidays.HolidayDate
WHERE holidays.HolidayDate IS NULL
AND allDays.dayOfWeek NOT IN ('Saturday', 'Sunday')
AND DateOfYear >= CONVERT(DATE, '1 ' + DATENAME(MONTH, GETDATE()) + ' 2016')
AND DateOfYear < CONVERT(DATE, '1 ' + DATENAME(MONTH, DATEADD(month, 1, GETDATE())) + ' 2016')
option (maxrecursion 10000)
일부 서식 지정은이 텍스트 벽에 대한 경이로움을 나타냅니다. 나는 이것을 읽을 수 있도록 포맷했고 훨씬 덜 혼란 스럽다. FWIW, 집계를 위해 재귀 cte 대신 집계표 또는 숫자 표를 사용해야합니다. 이 문제를 해결하려면 조금 더 자세하게 설명해야합니다. 가장 가능성이있는 것은 단지 날짜 만있는 것입니다. 모든 날짜의 목록에 합류 된 채로 남아있는 것으로 간주됩니다. –
예 기존의 최종 선택 (행 번호 비트 빼기)을 다른 cte에 넣은 다음이 필터링 된 cte에서 선택하여 행 번호 추가) –