我有一个表,其中包含基于键值的属性。示例:
CREATE TABLE ObjectAttributes
(
int objectId, key nvarchar(64), value nvarchar(512)
)
当我从中选择时,我得到:
objectId key value
----------------------------
1 Key 1 Value 1
1 Key 2 Value 2
我想知道是否可以使用 PIVOT 语法将其转换为:
objectId Key 1 Key 2
---------------------------
1 Value 1 Value 2
我知道我的所有表都有相同的键。 (不幸的是,我无法轻易更改表结构。这就是我尝试使用 PIVOTS 的原因)。
这里的一个大问题是枢轴需要使用聚合函数。有办法避免这种情况吗?我的尝试完全错误吗?或者有更好的解决方案吗?
最佳答案
对于固定列输出,枢轴不会比重复自连接更快。
SELECT
T1.objectID, T1.Value AS Key1, T2.Value AS Key2
FROM
ObjectAttributes T1
JOIN
ObjectAttributes T2 ON T1.objectID = T2.objectID
WHERE
T1.key = 'Key 1'
AND
T2.key = 'Key 2'
如果你想使用PIVOT,那么就使用MAX。因为每个对象/键只有一行,所以无论如何它都是微不足道的,并且可以满足 PIVOT 要求。
如果您想要将未知数量的行转入列,那么可以使用动态 SQL(按照 SQL Server 2000 解决方案)或在客户端代码中执行此操作。
如果每个对象都有固定数量的属性,那么我会考虑使用第二个表,其中包含由触发器维护的真实列。笨拙,但让阅读变得更轻松
关于sql-server-2005 - 键值表上的 SQL Server PIVOT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4555988/