SQL Server数据透视?将列名设置为行内值的某种方法

SQL Server数据透视?将列名设置为行内值的某种方法,sql,dynamic,row,pivot,Sql,Dynamic,Row,Pivot,我正在构建一个由多个跟踪器组成的系统,这些跟踪器将使用许多相同的列,因此有一个用于跟踪器的表格,跟踪器列,然后是一个交叉引用,用于哪个列与哪个跟踪器匹配,当用户插入跟踪器行时,不同的列值存储在共享同一记录id的多个行中,并存储特定列的值和名称 我需要找到一种方法,将值的列名动态更改为存储在同一行中的列名 i、 e 需要像这样 id | color | speed ------------------ 23 | red | fast 非常感谢您的帮助。这是不可能的。在SQL Server中,

我正在构建一个由多个跟踪器组成的系统,这些跟踪器将使用许多相同的列,因此有一个用于跟踪器的表格,跟踪器列,然后是一个交叉引用,用于哪个列与哪个跟踪器匹配,当用户插入跟踪器行时,不同的列值存储在共享同一记录id的多个行中,并存储特定列的值和名称

我需要找到一种方法,将值的列名动态更改为存储在同一行中的列名

i、 e

需要像这样

id | color | speed
------------------
23 | red   | fast

非常感谢您的帮助。

这是不可能的。在SQL Server中,列名始终是静态的。您可以生成动态SQL。

您可以使用。有两种方法,一种是静态透视,其中硬编码列的值;另一种是动态透视,其中列在运行时确定

静态轴(请参阅)

动态轴(请参阅)


两个查询将产生相同的结果。不同之处在于,在第一步中,您必须对要成为列的所有值进行编码

SQL不是为这种转换而设计的,您应该将此操作委托给您的应用程序层。@OlivierCoilland:PIVOT语法是ANSI(我相信是99)。SQL Server从V2005开始就支持该函数,考虑到理论上可以通过这种方式生成无限多的列……我找到了一种使用PIVOT的方法唯一的问题是我必须在进程中定义列的名称,但它确实将所有值适当地组合到一行中,该行由田园诗。Pivot可以做到这一点,但列名仍然是静态的。您不能让它们依赖于数据库内容。非常感谢您抽出时间发布。为我做了一件好事。
id | color | speed
------------------
23 | red   | fast
select *
from 
(
  select id, value, name
  from test
) x
pivot
(
  min(value)
  for name in ([color], [speed])
) p
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
                    from test
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
      = 'SELECT id,' + @cols + ' from 
         (
            SELECT id, value, name
            FROM test
         ) x
         pivot 
         (
            min(value)
            for name in (' + @cols + ')
         ) p '

execute(@query)