考虑以下#table:
guid field value
--------------------
123 A foo
123 B foobar
123 C 123
234 A bar;baz
234 B 3464
345 A foobaz
我需要将其转置/转换为以下#table2:
guid A B C
---------------------------
123 foo foobar 123
234 bar;baz 3464 -
345 foobaz - -
换句话说:guid
需要保留表格密钥,但所有field
都需要转换为列。
这在SQL Server中是否可行?
通常,我会使用服务器端(php,python,asp)脚本从数据库中提取#table
并通过迭代到结果集来转换结果集作为数组,但这不是一个选项案件。我需要一个只有sql的解决方案。
非常感谢任何帮助。
答案 0 :(得分:2)
这应该会转移您的数据并保留您的GUID。
select tbl.guid, tbl.[A], tbl.[B], tbl.[C] from (
select * from (
select guid, field, value
from #table
) t
pivot (
max(value) for field in ([A],[B],[C])
) p
) tbl
创建列以准备动态SQL:
declare @columns nvarchar(max) = (select stuff((
select distinct ',[' + t.field + ']'
from #table t
for xml path('')
),1,1,''))
将列混合到动态SQL中:
declare @sql = N'
select tbl.guid, ' + @columns + ' from (
select * from (
select guid, field, value
from #table
) t
pivot (
max(value) for field in (' + @columns + ')
) p
) tbl'
执行:
execute (@sql)