透视结果集(行到列)

时间:2014-07-07 13:40:16

标签: sql sql-server sql-server-2008

考虑以下#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的解决方案。

非常感谢任何帮助。

1 个答案:

答案 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)