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解决方案)或在客户端代码中执行.
如果每个对象具有固定数量的属性,那么我会考虑使用由触发器维护的实数列的第二个表.笨拙,但让阅读更容易
不,你无法避免聚合.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)