You have to pivot (cross-tab) the data to be able to update - or you have to join for each day, that is add a join for each day to be updated and then use the joined tables value in the update.
Update wt
Set wt.Mon = wd1.day
, wt.Tue = wd2.day
, wt.Wed = wd3.day
, wt.Thu = wd4.day
, wt.Fri = wd5.day
From @weeksTable wt
Inner Join @UpdateData wd1 On wd1.WeekNr = wt.WeekNr And wd1.Weekday = 'Mon'
Inner Join @UpdateData wd2 On wd2.WeekNr = wt.WeekNr And wd2.Weekday = 'Tue'
Inner Join @UpdateData wd3 On wd3.WeekNr = wt.WeekNr And wd3.Weekday = 'Wed'
Inner Join @UpdateData wd4 On wd4.WeekNr = wt.WeekNr And wd4.Weekday = 'Thu'
Inner Join @UpdateData wd5 On wd5.WeekNr = wt.WeekNr And wd5.Weekday = 'Fri';
I would just cross-tab the data...
Declare @weeksTable Table (WeekNr int, Mon int, Tue int, Wed int, Thu int, Fri int);
Declare @UpdateData Table ([WeekNr] int, [Weekday] varchar(30), [day] int);
Insert Into @weeksTable (WeekNr, Mon, Tue, Wed, Thu, Fri)
Values (1, 1, 1, 1, 1, 2)
, (2, 1, 1, 1, 1, 2)
, (3, 3, 3, 1, 1, 2);
Insert Into @UpdateData ([WeekNr], Weekday, day)
Values (1, 'Mon', 4)
, (1, 'Tue', 4)
, (1, 'Wed', 4)
, (1, 'Thu', 4)
, (1, 'Fri', 4)
, (2, 'Mon', 4)
, (2, 'Tue', 4)
, (2, 'Wed', 4)
, (2, 'Thu', 4)
, (2, 'Fri', 4)
, (3, 'Mon', 4)
, (3, 'Tue', 4)
, (3, 'Wed', 4)
, (3, 'Thu', 4)
, (3, 'Fri', 4);
Select *
From @weeksTable;
With updateData
As (
Select ud.WeekNr
, Mon = max(Case When ud.Weekday = 'Mon' Then ud.[day] End)
, Tue = max(Case When ud.Weekday = 'Tue' Then ud.[day] End)
, Wed = max(Case When ud.Weekday = 'Wed' Then ud.[day] End)
, Thu = max(Case When ud.Weekday = 'Thu' Then ud.[day] End)
, Fri = max(Case When ud.Weekday = 'Fri' Then ud.[day] End)
From @weeksTable wt
Inner Join @UpdateData ud On ud.WeekNr = wt.WeekNr
Group By
ud.WeekNr
)
Update wt
Set wt.Mon = ud.Mon
, wt.Tue = ud.Tue
, wt.Wed = ud.Wed
, wt.Thu = ud.Thu
, wt.Fri = ud.Fri
From @weeksTable wt
Inner Join updateData ud On ud.WeekNr = wt.WeekNr;
Select *
From @weeksTable;