Hi @Will Page ,
Thank you so much for posting here in Microsoft Q&A.
Please refer below and check whether it is working to you:
Step1: Timesheet Table createtion.
create table Timesheet
(
id int identity(1,1),
[Employee Code] int,
[Date] date,
[Hours Worked] decimal(8,2)
)
insert into Timesheet ([Employee Code],[Date],[Hours Worked]) values
(9998,'2020-12-15',8),
(9998,'2020-12-08',9.08),
(20,'2020-12-16',8),
(9998,'2020-12-09',4.35),
(30,'2020-12-16',9),
(10,'2020-12-16',9),
(9998,'2020-12-03',1.24),
(9998,'2020-12-20',8)
Step2: DateDimension Table createtion.
CREATE TABLE DateDimension
(TheDate DATE,
TheISOweek INT,
TheFirstOfWeek DATE,
TheLastOfWeek DATE
)
SET DATEFIRST 1, -- 1 = Monday, 7 = Sunday
DATEFORMAT mdy,
LANGUAGE US_ENGLISH;
DECLARE @StartDate date = '20200101';
DECLARE @CutoffDate date = DATEADD(DAY, -1, DATEADD(YEAR, 30, @StartDate));
;WITH seq(n) AS
(
SELECT 0 UNION ALL SELECT n + 1 FROM seq
WHERE n < DATEDIFF(DAY, @StartDate, @CutoffDate)
),
d(d) AS
(
SELECT DATEADD(DAY, n, @StartDate) FROM seq
),
src AS
(
SELECT
TheDate = CONVERT(date, d),
TheISOWeek = DATEPART(ISO_WEEK, d),
TheDayOfWeek = DATEPART(WEEKDAY, d)
FROM d
),
dim AS
(
SELECT
TheDate,
TheISOweek,
TheFirstOfWeek = DATEADD(DAY, 1 - TheDayOfWeek, TheDate),
TheLastOfWeek = DATEADD(DAY, 6, DATEADD(DAY, 1 - TheDayOfWeek, TheDate))
FROM src
)
INSERT INTO DBO.DateDimension
SELECT * FROM dim
ORDER BY TheDate
OPTION (MAXRECURSION 0);
Step3: Final query:
;with cte as(
select a.[Employee Code],b.TheISOweek,b.TheLastOfWeek
from Timesheet a
inner join DateDimension b on a.Date=b.TheDate)
,cte1 as (
select distinct a.TheDate,a.TheLastOfWeek,b.[Employee Code]
from DateDimension a
inner join cte b
on a.TheISOweek=b.TheISOweek and a.TheLastOfWeek=b.TheLastOfWeek
)
,cte2 as (
select *
,ROW_NUMBER() OVER(PARTITION BY [Employee Code],TheLastOfWeek ORDER BY thedate) RN
from cte1)
,CTE3 AS (
select distinct a.[Employee Code],a.TheLastOfWeek,b.[Hours Worked]
,'DAY'+trim(CAST(RN AS char)) DAYNUM
from cte2 a
left join Timesheet b
on a.TheDate=b.Date and a.[Employee Code]=b.[Employee Code]
)
select * from
(select * from CTE3 ) a
pivot
(max([Hours Worked])
for DAYNUM in ([DAY1],[DAY2],[DAY3],[DAY4],[DAY5],[DAY6],[DAY7])) p
Output:
Best regards
Melissa
If the answer is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.
Hot issues November--What can I do if my transaction log is full?
Hot issues November--How to convert Profiler trace into a SQL Server table