Refer the below Test Query for your reference.
DECLARE @Month INT
DECLARE @Year INT
DECLARE @Date DATE
DECLARE @TotalDays INT
-- Set Month And Year Value
SET @Month = 10
SET @Year = 2016
-- SET Default Date by month and year
SET @Date = CAST(RIGHT('0' + CAST(@Month as VARCHAR(2)), 2)+'-'+'01-'+ CAST(@Year as VARCHAR(4)) As DATE)
-- To Get Total days
SET @TotalDays = datediff(day, @Date, dateadd(month, 1, @Date))
-- Details table
DECLARE @Details AS TABLE([DATE] DATE,[DayName] VARCHAR(20),EmployeeName_Holdiday VARCHAR(15))
-- Table where Employee Details is stored
DECLARE @Table AS TABLE(EmployeeId INT,EmployeeName VARCHAR(20))
INSERT INTO @Table VALUES(1,'David')
INSERT INTO @Table VALUES(2,'Kevin')
INSERT INTO @Table VALUES(3,'Peter')
INSERT INTO @Table VALUES(4,'Jhon')
INSERT INTO @Table VALUES(5,'Andrea')
DECLARE @HolidayTable AS TABLE(HolidayDate date,Holidayname VARCHAR(20))
INSERT INTO @HolidayTable VALUES('10/11/2016','DASSERA')
INSERT INTO @HolidayTable VALUES('10/12/2016','MUHARRAM')
INSERT INTO @HolidayTable VALUES('10/31/2016','DIWALI')
-- SELECT * FROM @HolidayTable
-- To get total Employee count
DECLARE @TotalEmployeeCount INT
SET @TotalEmployeeCount = (SELECT COUNT(EmployeeId) FROM @Table)
-- Counter for While loop as well as for EmployeeCount Checking
DECLARE @Counter INT
Declare @EmployeeCounter INT
SET @Counter = 1
SET @EmployeeCounter = 1
WHILE @Counter<= @TotalDays
BEGIN
-- INSERT IN TO Temp table @Details
INSERT INTO @Details
VALUES (CAST(RIGHT('0' + CAST(@Month as VARCHAR(2)), 2)+'-'+ CAST(@Counter as VARCHAR(2)) +'-'+ CAST(@Year as VARCHAR(4)) As DATE)
,DATENAME(dw,DATEADD(DD,@Counter - 1,@Date))
,CASE WHEN EXISTS(SELECT HolidayDate FROM @HolidayTable WHERE CAST(HolidayDate as DATE) = CAST(DATEADD(DD,@Counter - 1,@Date) as DATE))
THEN (SELECT Holidayname FROM @HolidayTable WHERE CAST(HolidayDate as DATE) = CAST(DATEADD(DD,@Counter - 1,@Date) as DATE))
WHEN UPPER(DATENAME(dw,DATEADD(DD,@Counter - 1,@Date))) = UPPER('SUNDAY')
THEN 'Holiday'
ELSE (SELECT EmployeeName
FROM (SELECT ROW_NUMBER() OVER ( ORDER BY EmployeeId) as RowNumber
,EmployeeId
,EmployeeName
FROM @Table) tbl
WHERE tbl.RowNumber = @EmployeeCounter)
END)
-- CHECK FOR SUNDAY Also Increament only for Employee If its not sunday
IF UPPER(DATENAME(dw,DATEADD(DD,@Counter - 1,@Date))) <> UPPER('SUNDAY') AND NOT EXISTS(SELECT HolidayDate FROM @HolidayTable WHERE CAST(HolidayDate as DATE) = CAST(DATEADD(DD,@Counter - 1,@Date) as DATE))
BEGIN
if @EmployeeCounter < @TotalEmployeeCount
BEGIN
SET @EmployeeCounter += 1
END
ELSE
BEGIN
SET @EmployeeCounter = 1
END
END
SET @Counter = @Counter + 1
END
SELECT REPLACE(CONVERT(VARCHAR(24),CAST([DATE] AS DATE),103) ,'/','-')[Date]
,[DayName]
,EmployeeName_Holdiday
FROM @Details
OUTPUT
Date |
DayName |
EmployeeName_Holdiday |
01-10-2016 |
Saturday |
David |
02-10-2016 |
Sunday |
Holiday |
03-10-2016 |
Monday |
Kevin |
04-10-2016 |
Tuesday |
Peter |
05-10-2016 |
Wednesday |
Jhon |
06-10-2016 |
Thursday |
Andrea |
07-10-2016 |
Friday |
David |
08-10-2016 |
Saturday |
Kevin |
09-10-2016 |
Sunday |
Holiday |
10-10-2016 |
Monday |
Peter |
11-10-2016 |
Tuesday |
DASSERA |
12-10-2016 |
Wednesday |
MUHARRAM |
13-10-2016 |
Thursday |
Jhon |
14-10-2016 |
Friday |
Andrea |
15-10-2016 |
Saturday |
David |
16-10-2016 |
Sunday |
Holiday |
17-10-2016 |
Monday |
Kevin |
18-10-2016 |
Tuesday |
Peter |
19-10-2016 |
Wednesday |
Jhon |
20-10-2016 |
Thursday |
Andrea |
21-10-2016 |
Friday |
David |
22-10-2016 |
Saturday |
Kevin |
23-10-2016 |
Sunday |
Holiday |
24-10-2016 |
Monday |
Peter |
25-10-2016 |
Tuesday |
Jhon |
26-10-2016 |
Wednesday |
Andrea |
27-10-2016 |
Thursday |
David |
28-10-2016 |
Friday |
Kevin |
29-10-2016 |
Saturday |
Peter |
30-10-2016 |
Sunday |
Holiday |
31-10-2016 |
Monday |
DIWALI |