我正在构建一个多个跟踪器的系统,这些跟踪器将使用很多相同的列,因此有一个用于跟踪器,跟踪器列的表,然后是一个交叉引用,当用户使用哪些列时跟踪哪个跟踪器插入跟踪器行,不同的列值存储在共享相同记录ID的多个行中,并存储特定列的值和名称。
我需要找到一种方法来动态地将值的列名更改为存储在同一行中的列名。
即
id | value | name
------------------
23 | red | color
23 | fast | speed
需要看起来像这样。
id | color | speed
------------------
23 | red | fast
非常感谢任何帮助,谢谢。
答案 0 :(得分:10)
您可以使用PIVOT
执行此类查询。有两种方法,一种是使用硬编码列值的静态数据透视图,另一种是在运行时确定列的动态数据透视图。
静态数据透视(请参阅SQL Fiddle with Demo)
select *
from
(
select id, value, name
from test
) x
pivot
(
min(value)
for name in ([color], [speed])
) p
动态数据透视(请参阅SQL Fiddle with Demo)
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)
两个查询都会产生相同的结果。不同之处在于,在第一个中,您必须编写要成为列的所有值。
答案 1 :(得分:0)
这是不可能的。 SQL Server中的列名始终静态。您可以生成动态SQL。