键值表上的SQL Server PIVOT

Kyl*_*yle 10 pivot sql-server-2005

我有一个基于键值的属性表.例:

CREATE TABLE ObjectAttributes
(
  int objectId, key nvarchar(64), value nvarchar(512)
)
Run Code Online (Sandbox Code Playgroud)

当我从中选择时,我得到:

objectId  key      value
----------------------------
1         Key 1    Value 1
1         Key 2    Value 2
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以使用PIVOT语法将其转换为:

objectId  Key 1     Key 2
---------------------------
1         Value 1   Value 2
Run Code Online (Sandbox Code Playgroud)

我知道我的所有表都有相同的键.(不幸的是我不能轻易改变表格结构.这就是导致我尝试使用PIVOTS的原因).

这里最大的问题是枢轴需要使用聚合函数.有办法避免这种情况吗?尝试这个我完全错了吗?或者有更好的解决方案吗?

gbn*_*gbn 11

对于固定列输出,枢轴将不会更快,然后重复自连接.

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'
Run Code Online (Sandbox Code Playgroud)

如果你想使用PIVOT,那么只需使用MAX.因为每个对象/键有一行它无论如何都是微不足道的,并且满足PIVOT要求.

如果要将未知数量的行PIVOT分配到列中,那么它是动态SQL(根据SQL Server 2000解决方案)或在客户端代码中执行.

如果每个对象具有固定数量的属性,那么我会考虑使用由触发器维护的实数列的第二个表.笨拙,但让阅读更容易


Sir*_*bin 6

不,你无法避免聚合.SQL Server需要某种方法将许多可能的行组合成一个值.您碰巧有一个值,但PIVOT功能在考虑很多行的情况下完成.

SELECT objectId, [Key 1], [Key 2]
FROM
(SELECT objectId, [key], value FROM ObjectAttributes) AS source
PIVOT
(
 MIN(value)
 FOR [key] IN ([Key 1], [Key 2])
) as pvt
Run Code Online (Sandbox Code Playgroud)