我正在尝试围绕它的多个列来旋转表格以获得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
我已经搜索了相当多的东西,但没有找到类似的情况 - 特别是因为枢轴似乎与我想要完成的方向相反。
答案 0 :(得分:20)
将列转换为行称为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;
最后,您可以将CROSS APPLY
与VALUES
(2008+)或UNION ALL
一起使用而不是UNPIVOT功能:
SELECT name, column, age
FROM yourtable
CROSS APPLY
(
VALUES
('age', cast(age as varchar(10)),
('gender', gender)
) c (column, value);
这些版本中的任何一个都会为您提供所需的结果。您会注意到我必须将age
列投射到varchar
。这是因为列的数据类型/长度(在unpivot中)必须相同,因为您将在最终结果中将它们转换为单个列。
答案 1 :(得分:0)
SELECT name, column, value
FROM (SELECT name, age, gender
FROM table) src
UNPIVOT (value FOR column IN (age, gender)) pvt