sql-server-2005 - 键值表上的 SQL Server PIVOT

标签 sql-server-2005 pivot

我有一个表,其中包含基于键值的属性。示例:

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/

相关文章:

sql-server - 聚集索引和唯一索引有什么区别?

SQL Server 相当于 ORACLE INSTR

xml - 在 SQL Server 2005 中将 XML 数据转换为表格和 XML 格式

sql - 将多行合并为多列

tsql - SQL Server 2008 - 将多值列拆分为具有唯一值的行

sql - 插入多条记录的SQL

pivot - 两个旋转柱之间的外观差异

python - 在 Python 中按列顺序将特定列转换为行并保持其余列相同

r - 将名称不规则的列转为行

sql-server-2005 - 何时在 SQL Server 2005 中使用临时表