2010-07-15 52 views
2

我想在SQL Server中将行显示为列。将行显示为列

我的表看起来像这样:

 
images_id item_id images_name 
------------------------------- 
1   1  image1.jpg 
2   1  image2.jpg 
3   1  image3.jpg 
4   2  image4.jpg 
5   2  image5.jpg 
6   2  image6.jpg 

我想这样的输出:

 
images_id item_id image1  image2  image3  
------------------------------------------------------ 
1   1  image1.jpg image2.jpg image3.jpg 
2   2  image4.jpg image5.jpg image6.jpg 

这里是一个image link

这可能吗? item_id必须是动态可变的(它不稳定)。

+0

+1:对于前期是需要有关动态支点查询。我更新了标签,你应该可以在等待的时候找到大量的例子。 – 2010-07-15 17:42:59

+0

这是链接:[使用PIVOT和UNPIVOT](http://msdn.microsoft.com/en-us/library/ms177410.aspx)。我不知道这个动态ID是否可以轻松实现。 – Mike 2010-07-15 17:46:13

+0

@OMG小马:在我将它改为文本之前,我看到你将图像放入问题中(为了便于复制+粘贴)。图像看起来更好。如果你喜欢图像,你可以放回图像。 :) – 2010-07-15 17:47:01

回答

0

这是不可能的,而无需使用动态SQL。 PIVOT要求您仍然指定列。

让我知道,如果动态SQL是可以接受的,我会给你一个例子。

0

这里是你如何使用动态SQL这样的:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME('image' + cast(row_number() over(partition by itemid order by imageid) as varchar(5))) 
      FROM test c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT itemid, ' + @cols + ' from 
      (
       select itemid, imagename, 
        ''image'' + cast(row_number() over(partition by itemid order by imageid) as varchar(5)) col 
       from test 
      ) x 
      pivot 
      (
       min(imagename) 
       for col in (' + @cols + ') 
      ) p ' 


execute(@query) 

SQL Fiddle with Demo