2013-01-08 37 views
0

我有一个Table1动态透视(排列)

ID Instance Name Size Tech 
1 0  D1 123 ABC 
1 1  D2 234 CDV 
2 2  D3 234 CDV 
2 3  D4 345 SDF 

我需要使用动态PIVOT沿着看起来像标题中的结果:

ID | Instance0_Name | Instance0_Size | Instance0_Tech | Instance1_Name | Instance1_Size | Instance1_tech 
1 | D1    | 123   | ABC   | D2    | 234   | CDV 

任何帮助,将不胜感激。使用Sql Server 2008.

对不起,此前的帖子。

+0

你想在最终结果中显示“ID”吗?你有不同的'ID',你想要哪一个? – Taryn

+0

我刚刚意识到这一点。感谢您指出了这一点。 – Rodricks

+0

是否要将每个单独的“ID”值分别与所有与该ID关联的实例分离出来?由于命名基于实例值并且实例值似乎是唯一的,因此这最终会看起来非常难看。这将导致每列有一个值,并且它不适用于该行的所有实例都为NULL。根据数据集大小,您可能会遇到列限制问题。 –

回答

5

你所需的输出是不完全清楚,但可以使用两种UNPIVOTPIVOT函数来得到结果

如果你知道的列数,那么你可以硬编码值:

select * 
from 
(
    select id, 
    'Instance'+cast(instance as varchar(10))+'_'+col col, 
    value 
    from 
    (
    select id, 
     Instance, 
     Name, 
     cast(Size as varchar(50)) Size, 
     Tech 
    from yourtable 
) x 
    unpivot 
    (
    value 
    for col in (Name, Size, Tech) 
) u 
) x1 
pivot 
(
    max(value) 
    for col in 
    ([Instance0_Name], [Instance0_Size], [Instance0_Tech], 
    [Instance1_Name], [Instance1_Size], [Instance1_Tech], 
    [Instance2_Name], [Instance2_Size], [Instance2_Tech], 
    [Instance3_Name], [Instance3_Size], [Instance3_Tech]) 
) p 

SQL Fiddle with Demo

然后,如果你有一个未知的数值,可以使用动态SQL:

DECLARE @query AS NVARCHAR(MAX), 
    @colsPivot as NVARCHAR(MAX) 

select @colsPivot = STUFF((SELECT ',' 
         + quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name) 
        from yourtable t 
        cross apply sys.columns as C 
        where C.object_id = object_id('yourtable') and 
         C.name not in ('id', 'instance') 
        group by t.instance, c.name 
        order by t.instance 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = 'select * 
     from 
     (
     select id, 
      ''Instance''+cast(instance as varchar(10))+''_''+col col, 
      value 
     from 
     (
      select id, 
      Instance, 
      Name, 
      cast(Size as varchar(50)) Size, 
      Tech 
      from yourtable 
     ) x 
     unpivot 
     (
      value 
      for col in (Name, Size, Tech) 
     ) u 
    ) x1 
     pivot 
     (
     max(value) 
     for col in ('+ @colspivot +') 
    ) p' 

exec(@query) 

SQL Fiddle with Demo

如果结果不正确,那么请编辑您的OP和张贴你的两个你所提供的IDS的预期效果。