2016-06-21 72 views
0

我需要编写一个查询来获取行数据作为列。我在2个表格之间加入了这个连接。查询帮助 - 获取行数据作为列

实施例:

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?

谢谢。

+1

谷歌为'SQL pivot' –

+0

使用PIVOT取决于您正在使用的RDBMS。 MySQL没有PIVOT功能,但我认为PostgreSQL,SQL Server和Oracle都可以。请记住:每个供应商实施SQL的方式不同,AFAIK PIVOT不是SQL标准的一部分 – Barranka

+0

Johnny我看到了您的其他说明并更新了我提供的PIVOT答案,以向您展示如何使用2个表之间的内部联接PIVOT查询。干杯。 – Matt

回答

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

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

太棒了。这只是我想要的方式。非常感谢。 – JohnnyCage

+0

您的欢迎,@TimeBiegeleisen的方法是一个很好的方法,如果您做了大量的数据透视,它本质上就是数据库引擎对PIVOT查询所做的事情。 – Matt

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是正确的。

+0

对不起,我正在使用SQL Server 2012.此外,列ID和管理器来自一个表和另一个表中的另外两列。让我看看我是否可以使用您的查询来获得我想要的。谢谢。 – JohnnyCage