SQL Server取消汇总多个列

mat*_*ian 12 sql sql-server unpivot

我正在尝试围绕它的多个列旋转一个表来获得3列(数据透视图,列名,值)

例如:

name  |  age  |  gender
------+-------+---------
John  |   20  |    M
Jill  |   21  |    F
Run Code Online (Sandbox Code Playgroud)

会成为:

name | column | value
-----+--------+-------
John |  age   |   20
John | gender |   M
Jill |  age   |   21
Jill | gender |   F
Run Code Online (Sandbox Code Playgroud)

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

Tar*_*ryn 24

将列转换为行称为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;
Run Code Online (Sandbox Code Playgroud)

如果您使用的是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;
Run Code Online (Sandbox Code Playgroud)

最后,而不是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);
Run Code Online (Sandbox Code Playgroud)

任何这些版本都会为您提供所需的结果.你会注意到我必须将age列转换为varchar.这是因为列的数据类型/长度(在unpivot中)必须相同,因为您将在最终结果中将它们转换为单个列.

  • “交叉应用”技巧太棒了。它实际上似乎比使用“UNPIVOT”更灵活,并且在我看来更具可读性 (4认同)