Looking at the problem you described I started out by only putting the column value into the correct day of the week, this will create 7 rows each only populating the column for the day on which the [Start Date]
falls.
SELECT
[Monday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Monday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Tuesday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Tuesday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Wednesday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Wednesday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Thursday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Thursday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Friday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Friday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Saturday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Saturday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Sunday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Sunday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
FROM
[Resource table]
But then I thought, you might want to display all these in one row, in which case you would need to group them by a certain value, or values. I am unaware of a SQL Aggregate function for creating a concatenated list of column values for a group so you would probably need to create one, but you could group this by training room and if there's only ever going to be one entry per day per training room something like the following could be used (SQL purists might want to look away now):
SELECT
[Week Id] = CONVERT(VARCHAR,DATEPART(YEAR,[Start Date])) + '-' + CONVERT(VARCHAR,DATEPART(WEEK,[Start Date]))
,[Training Room]
,[Monday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Monday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Tuesday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Tuesday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Wednesday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Wednesday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Thursday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Thursday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Friday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Friday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Saturday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Saturday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Sunday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Sunday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
FROM
[Resource table]
GROUP BY
CONVERT(VARCHAR,DATEPART(YEAR,[Start Date])) + '-' + CONVERT(VARCHAR,DATEPART(WEEK,[Start Date]))
,[Training Room]
You could always leave out the declaration of the two initial columns I've grouped by ([Week Id]
and [Training Room]
) as you don't have to display them in order to view them.