我正在尝试围绕它的许多列旋转一个表,以获取3列(数据透视表,列名称,值)
因此,例如:
name | age | gender
------+-------+---------
John | 20 | M
Jill | 21 | F
会成为:
name | column | value
-----+--------+-------
John | age | 20
John | gender | M
Jill | age | 21
Jill | gender | F
我已经在Google上搜索了很多,但没有找到类似的情况-尤其是因为枢轴似乎是在与我要完成的方向相反的方向上完成的。
最佳答案
列到行的转换称为UNPIVOT
。您没有指定要使用的SQL Server版本,但是有几种不同的方法来获得结果。
您可以将SELECT
与UNION ALL
一起使用:
SELECT name, 'age' as column, cast(age as varchar(10)) as value
FROM yourtable
UNION ALL
SELECT name, 'gender' as column, gender as value
FROM yourtable;
如果使用的是SQL Server 2005+,则可以使用UNPIVOT函数:
SELECT name, column, age
FROM
(
SELECT
name,
age = cast(age as varchar(10)),
gender
FROM yourtable
) d
UNPIVOT
(
value
for column in (age, gender)
) unpiv;
最后,除了UNPIVOT函数外,还可以将
CROSS APPLY
与VALUES
(2008+)或UNION ALL
结合使用:SELECT name, column, age
FROM yourtable
CROSS APPLY
(
VALUES
('age', cast(age as varchar(10)),
('gender', gender)
) c (column, value);
这些版本中的任何一个都将为您提供所需的结果。您会注意到,我不得不将
age
列强制转换为varchar
。这是因为列的数据类型/长度(以无数据点为单位)必须相同,因为您将在最终结果中将它们转换为单个列。