我正在尝试围绕它的许多列旋转一个表,以获取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版本,但是有几种不同的方法来获得结果。

您可以将SELECTUNION 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 APPLYVALUES(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。这是因为列的数据类型/长度(以无数据点为单位)必须相同,因为您将在最终结果中将它们转换为单个列。

10-02 02:32
查看更多