SQL Server取消汇总多个列

时间:2014-07-18 15:11:20

标签: sql sql-server unpivot

我正在尝试围绕它的多个列来旋转表格以获得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

我已经搜索了相当多的东西,但没有找到类似的情况 - 特别是因为枢轴似乎与我想要完成的方向相反。

2 个答案:

答案 0 :(得分:20)

将列转换为行称为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;

最后,您可以将CROSS APPLYVALUES(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