Несмотря на то, что запрос cletus является правильным, стоит указать, что вы можете использовать ключевое слово UNPIVOT в SQL Server 2005 и более поздних версиях, чтобы сделать почти то же самое:
select
period, nameOfVehicle, value
from T unpivot (
value for nameOfVehicle in ([Car],[Truck],[Boat])
) as U;
Разница между UNPIVOT и решением cletus заключается в том, что UNPIVOT не будет включать строки, для которых [значение] равно NULL. Если вам нужны значения NULL, вам нужно быть немного хитрым и использовать значение, которое никогда не встречается в таблице (здесь я использую пустую строку):
with X(period,Car,Truck,Boat) as (
select period,coalesce(Car,''),coalesce(Truck,''),coalesce(Boat,'')
from T
)
select
period, nameOfVehicle, case when value = '' then null else value end as value
from X unpivot (
value for nameOfVehicle in ([Car],[Truck],[Boat])
) as U;
В зависимости от столбцов, которые вы сохраните после отмены поворота, это может быть другой вариант (это решение сохранит значения NULL):
select
period,
nameOfVehicle,
max(case nameOfVehicle
when 'Truck' then Truck
when 'Car' then Car
when 'Boat' then Boat end) as value
from T cross join (
values ('Truck'),('Car'),('Boat')
) as Columns(nameOfVehicle)
group by period, nameOfVehicle;