Such problems were already solved. (For example: https://learn.microsoft.com/en-us/answers/questions/513860/query-to-change-vertical-to-orizontal.html).
Try this script too:
declare @cols varchar(max) = (select string_agg(quotename([Date]), ',') within group (order by [Date]) from MyTable)
/*
In older SQL, use this instead:
declare @cols varchar(max) = stuff((
select ',' + quotename([Date])
from MyTable
order by [Date]
for xml path('')
), 1, 1, '')
*/
declare @sql varchar(max) = concat(
'select c as [ ], ', @cols, '
from (
select [date], Col1, Col2, Col3
from MyTable
) t
unpivot
(
v for c in (Col1, Col2, Col3)
) u
pivot
(
max (v) for [Date] in (', @cols, ')
) p')
--print @sql
exec (@sql)