我有數據的列名的表:SQL選擇列名作爲值
period, Truck, Car, Boat
其中列包含數值,並且週期柱是具有1至48標識列,所以有48行。
我想按摩這個表格成一個格式,我有一個名稱列和值列以及時期列如。
period, NameOfVehicle, Value
我想創建一個orignal表的視圖來做到這一點?我如何選擇列名並將它們和正確的值從該列放到NameOfVehicle和Value列中?
我有數據的列名的表:SQL選擇列名作爲值
period, Truck, Car, Boat
其中列包含數值,並且週期柱是具有1至48標識列,所以有48行。
我想按摩這個表格成一個格式,我有一個名稱列和值列以及時期列如。
period, NameOfVehicle, Value
我想創建一個orignal表的視圖來做到這一點?我如何選擇列名並將它們和正確的值從該列放到NameOfVehicle和Value列中?
如果你有固定的欄目,你總是可以做到這一點:
SELECT period, 'Truck' AS NameOfVehicle, Truck AS Value FROM vehicle
UNION ALL
SELECT period, 'Car', Car FROM vehicle
UNION ALL
SELECT period, 'Boat', Boat FROM vehicle
如果列是動態的或未知的,然後它是一個有點困難,將依靠供應商特定的功能來查詢模式和動態SQL聲明。
雖然克萊的查詢是正確的,這是值得指出的是,你可以使用關鍵字UNPIVOT在SQL Server 2005及更高版本幾乎做了同樣的事情:
select
period, nameOfVehicle, value
from T unpivot (
value for nameOfVehicle in ([Car],[Truck],[Boat])
) as U;
UNPIVOT和克萊的解決方案之間的區別是, 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;
取決於你保住後列unpivoting,這可能是另一種選擇(該解決方案將保留爲空值):
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;
你將需要更加具體談談你的數據 - 究竟應該NameOfVehicle的內容來確定,等 – Amber 2009-08-09 23:20:56
NameAndVehicle的內容是Truck,Car和Boat。 – theringostarrs 2009-08-09 23:26:10