отображать строки в виде столбца

Я хочу отображать строки в виде столбца в 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

Вот ссылка на изображение.

Это возможно или нет? item_id должен быть динамически изменяемым (он нестабилен).


person foekall    schedule 15.07.2010    source источник
comment
+1: за откровенность в необходимости динамического сводного запроса. Я обновил теги, вы сможете найти множество примеров, пока ждете.   -  person OMG Ponies    schedule 15.07.2010
comment
Вот ссылка: Использование PIVOT и UNPIVOT. Я не знаю, легко ли получить динамический идентификатор с этим.   -  person Mike    schedule 15.07.2010
comment
@OMG Ponies: я вижу, вы вставили изображение в вопрос как раз перед тем, как я изменил его на текст (для простоты копирования и вставки). Изображение выглядит лучше. Вы можете вернуть изображение, если предпочитаете изображения. :)   -  person Mark Byers    schedule 15.07.2010
comment
возможный дубликат Получить ROWS как COLUMNS (динамический запрос PIVOT SQL Server)   -  person RichardTheKiwi    schedule 03.05.2013


Ответы (3)



Это невозможно без использования динамического SQL. PIVOT требует, чтобы вы еще указали столбцы.

Дайте мне знать, допустим ли динамический SQL, и я приведу вам пример.

person Joel Mansford    schedule 15.07.2010

Вот как вы можете использовать Dynamic 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 с демонстрацией.

person Taryn    schedule 09.08.2012