SQL Server支持?某种方法可以将列名设置为行内的值

ccs*_*on3 4 sql pivot row dynamic

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

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

id | value | name
------------------
23 | red   | color
23 | fast  | speed
Run Code Online (Sandbox Code Playgroud)

需要看起来像这样.

id | color | speed
------------------
23 | red   | fast
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助,谢谢.

Tar*_*ryn 10

您可以使用a执行此类查询PIVOT.有两种方法,一种是静态数据透视表,用于对列的值进行硬编码,另一种是动态数据透视表,用于在运行时确定列.

Static Pivot(参见SQL小提琴演示)

select *
from 
(
  select id, value, name
  from test
) x
pivot
(
  min(value)
  for name in ([color], [speed])
) p
Run Code Online (Sandbox Code Playgroud)

Dynamic Pivot(参见SQL小提琴演示)

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

两个查询都会产生相同的结果.不同之处在于,在第一个中,您必须编写要成为列的所有值.