我有这个表:
id fName lName Address PostCode ContactNumber
-----------------------------------------------------
1 Tom Daley London EC1 4EQ 075825485665
2 Jessica Ennis Sheffield SF2 3ER 075668956665
3 Joe Bloggs Glasgow G3 2AZ 075659565666
我想查询给我的结果是这样的:
id | label
1 | Tom
1 | Daley
1 | London
1 | EC1 4EQ
1 | 075825485665
2 | Jessica
2 | Ennis
2 | Sheffied
等等等等。
任何建议请在如何做到这一点。
您可以使用UNPIVOT
函数将列到行:
select id, value
from yourtable
unpivot
(
value
for col in ([fName], [lName], [Address], [PostCode], [ContactNumber])
) unpiv
请参阅SQL拨弄演示 。
该UNPIVOT将要求所有列的数据类型是相同的。 所以,你可能需要进行cast
/ convert
与此类似不同数据类型的列:
select id, value
from
(
select id, [fName], [lName], [Address], [PostCode],
cast([ContactNumber] as varchar(15)) [ContactNumber]
from yourtable
) src
unpivot
(
value
for col in ([fName], [lName], [Address], [PostCode], [ContactNumber])
) unpiv;
请参阅SQL拨弄演示 。
在SQL Server 2008开始,这也可以采用书面CROSS APPLY
用VALUES
:
select t.id,
c.value
from yourtable t
cross apply
(
values(fName),
(lName),
(Address),
(PostCode),
(cast(ContactNumber as varchar(15)))
) c (value)
请参阅SQL拨弄演示
怎么样是这样的:
SELECT
id, fName as label
FROM
table
UNION ALL
SELECT
id, lName
FROM
table
UNION ALL
SELECT
id, Address
FROM
table
...etc