我需要编写一个查询来获取行数据作为列。我有两个表之间的连接。
示例:
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中执行此操作吗?
答案 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