如何在SQL Server 2012中将行数据作为列?

时间:2016-06-21 16:26:09

标签: sql sql-server-2012

我需要编写一个查询来获取行数据作为列。我有两个表之间的连接。

示例:

ID | Manager| Property| Value
--------------------------
1  | John   | Salary  | 300000
1  | John   | Age     | 42
1  | John   | Dept    | IT

等等。管理器的属性应该都在同一行,所以这里不需要3行,而是需要像

这样的数据
ID | Manager | Salary | Age | Dept
-----------------------------------
1  | John    | 300000 | 42  | IT

我们可以直接在SQL中执行此操作吗?

2 个答案:

答案 0 :(得分:2)

您从未告诉我们您使用的是哪个版本的SQL,但以下数据透视查询应该适用于大多数RDBMS:

SELECT ID, Manager,
    MAX(CASE WHEN Property = 'Salary' THEN Salary ELSE NULL END) AS Salary,
    MAX(CASE WHEN Property = 'Age'    THEN Age    ELSE NULL END) AS Age,
    MAX(CASE WHEN Property = 'Dept'   THEN Dept   ELSE NULL END) AS Dept
FROM yourTable
GROUP BY ID, Manager

此解决方案依赖于一种技巧,即假设MAX函数忽略NULL值,这对于MySQL,Oracle和SQL Server都是如此。

答案 1 :(得分:2)

根据您对其他答案的评论,如果2个表没有问题,只需在初始选择中加入。在SQL 2012中,Pivot是一个很好的功能。

SELECT
    *
FROM
    (SELECT
       m.Id
       ,m.Manager
       ,a.Property
       ,a.Value
    FROM
       Managers m
       INNER JOIN Attributes a
       ON m.Id = a.Id
       ) t
    PIVOT
       (
          MAX(Value)
          FOR Property IN ([Salary],[Age],[Dept])
       ) AS p

如果在RDBMS中可用,则使用PIVOT

SELECT
    *
FROM
    (SELECT * FROM TableName) t
    PIVOT
       (
          MAX(Value)
          FOR Property IN ([Salary],[Age],[Dept])
       ) AS p