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 |