【发布时间】:2016-11-22 14:56:48
【问题描述】:
我有一个查询,它根据存储我们所有公共假期的表计算一个月内的工作日数。
当前输出将显示所有工作日,不包括公共假期和周六和周日,我想显示每个月的每一天,但不要在公共假期或周六或周日增加。
有没有办法有条件地增加行号?
查询如下:
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,然后从此过滤后的 cte 中选择,添加行号)
标签: sql sql-server database tsql