итеративный просмотр записей в sqlserver 2005 для форматирования вывода - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть таблица изображений с такими столбцами и похожими на данные

теперь мне нужно показывать подобные данные при запуске запроса

id  maintitle subtitle  imagename
  1  ram       raman     abc.jpg
  2  manu      kiran     a2.jpg
  2  manoj     kumar     a3.jpg
  2  chiru     kumar     a4.jpg
  3  anu       anitha    a4.jpg
  3  anupam    aruna     a4.jpg

нужно проверить идентификатор, если он выходит из более чем одной строки, то существует 2

имя изображения строки, добавьте новый столбец и отобразите здесь

нужен вывод как это

 id  maintitle subtitle  imagename  imagename2 imagename3
  1  ram       raman     abc.jpg     null       null
  2  part1     kiran     a2.jpg      a3.jpg     a4.jpg
  3  anu       anitha    a4.jpg      a4.jpg     null

Пример: у меня есть такие данные

INSERT @YourTable VALUES (2,'manu'  ,'kiran' ,'a2.jpg')
INSERT @YourTable VALUES (2,'manoj' ,'kumar' ,'a3.jpg')
INSERT @YourTable VALUES (2,'chiru' ,'kumar' ,'a4.jpg')
INSERT @YourTable VALUES (2,'manu'  ,'kumar' ,'a5.jpg')
INSERT @YourTable VALUES (2,'manoj' ,'kumar' ,'a6.jpg')
INSERT @YourTable VALUES (2,'chiru' ,'kumar' ,'a7.jpg')  

здесь у меня 6 строк, поэтому мне нужно создать шесть столбцов. если он имеет 4 строки, то для столбцов следует создавать динамически, надеюсь, мой вопрос ясен

Может кто-нибудь сказать мне, как решить эту проблему

любое решение было бы замечательно

1 Ответ

2 голосов
/ 24 ноября 2010

ваши данные выборки не соответствуют вашей выборке. этот код использует ваши примеры данных, попробуйте это:

DECLARE @YourTable table (id int, maintitle varchar(10), subtitle varchar(10), imagename varchar(10))
INSERT @YourTable VALUES (1,'ram'   ,'raman' ,'abc.jpg')
INSERT @YourTable VALUES (2,'manu'  ,'kiran' ,'a2.jpg')
INSERT @YourTable VALUES (2,'manoj' ,'kumar' ,'a3.jpg')
INSERT @YourTable VALUES (2,'chiru' ,'kumar' ,'a4.jpg')
INSERT @YourTable VALUES (3,'anu'   ,'anitha','a4.jpg')
INSERT @YourTable VALUES (3,'anupam','aruna' ,'a4.jpg')

;WITH YourTableOrdered AS
(SELECT
     *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id,imagename, maintitle,subtitle) AS RowNumber
     FROM @YourTable
)
SELECT
    t1.id,t1.maintitle,t1.subtitle,t1.imagename
        ,t2.imagename AS imagename2
        ,t3.imagename AS imagename3
    FROM YourTableOrdered                t1
        LEFT OUTER JOIN YourTableOrdered t2 ON t1.id=t2.id and t2.RowNumber=2
        LEFT OUTER JOIN YourTableOrdered t3 ON t1.id=t3.id and t3.RowNumber=3
    WHERE t1.RowNumber=1

ВЫХОД:

id          maintitle  subtitle   imagename  imagename2 imagename3
----------- ---------- ---------- ---------- ---------- ----------
1           ram        raman      abc.jpg    NULL       NULL
2           manu       kiran      a2.jpg     a3.jpg     a4.jpg
3           anu        anitha     a4.jpg     a4.jpg     NULL

(3 row(s) affected)

РЕДАКТИРОВАТЬ на основе редактирования вопроса ОП с указанием множества / неизвестного количества файлов на один идентификатор.

у вас есть три варианта:

1) код фиксированного запроса с более чем достаточным количеством LEFT JOINS, например:

;WITH YourTableOrdered AS
(SELECT
     *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id,imagename, maintitle,subtitle) AS RowNumber
     FROM @YourTable
)
SELECT
    t1.id,t1.maintitle,t1.subtitle,t1.imagename
        ,t2.imagename AS imagename2
        ,t3.imagename AS imagename3
        ,t4.imagename AS imagename4
        ,t5.imagename AS imagename5
        ,t6.imagename AS imagename6
        ,t7.imagename AS imagename7
        ,t8.imagename AS imagename8
    FROM YourTableOrdered                t1
        LEFT OUTER JOIN YourTableOrdered t2 ON t1.id=t2.id and t2.RowNumber=2
        LEFT OUTER JOIN YourTableOrdered t3 ON t1.id=t3.id and t3.RowNumber=3
        LEFT OUTER JOIN YourTableOrdered t4 ON t1.id=t4.id and t4.RowNumber=4
        LEFT OUTER JOIN YourTableOrdered t5 ON t1.id=t5.id and t5.RowNumber=5
        LEFT OUTER JOIN YourTableOrdered t6 ON t1.id=t6.id and t6.RowNumber=6
        LEFT OUTER JOIN YourTableOrdered t7 ON t1.id=t7.id and t7.RowNumber=7
        LEFT OUTER JOIN YourTableOrdered t8 ON t1.id=t8.id and t8.RowNumber=8
    WHERE t1.RowNumber=1

2) получить максимальное количество файлов на один идентификатор, а затем создать динамический оператор SQL, содержащий это количество объединений. используйте это, чтобы получить максимальное количество файлов:

DECLARE @MaxFiles  int
SELECT
    @MaxFiles=MAX(CountOf)
    FROM (SELECT
              id,COUNT(*) AS CountOf
              FROM @YourTable
              GROUP BY id
         ) dt

3) объединить все имена файлов в один список через запятую в одном столбце, например:

DECLARE @YourTable table (id int, maintitle varchar(10), subtitle varchar(10), imagename varchar(10))
INSERT @YourTable VALUES (1,'ram'   ,'raman' ,'abc.jpg')
INSERT @YourTable VALUES (2,'manu'  ,'kiran' ,'a2.jpg')
INSERT @YourTable VALUES (2,'manoj' ,'kumar' ,'a3.jpg')
INSERT @YourTable VALUES (2,'chiru' ,'kumar' ,'a4.jpg')
INSERT @YourTable VALUES (2,'manu'  ,'kumar' ,'a5.jpg')
INSERT @YourTable VALUES (2,'manoj' ,'kumar' ,'a6.jpg')
INSERT @YourTable VALUES (2,'chiru' ,'kumar' ,'a7.jpg')  
INSERT @YourTable VALUES (3,'anu'   ,'anitha','a4.jpg')
INSERT @YourTable VALUES (3,'anupam','aruna' ,'a4.jpg')    


;WITH YourTableOrdered AS
(SELECT
     *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id,imagename, maintitle,subtitle) AS RowNumber
     FROM @YourTable
)
SELECT
    t1.id,t1.maintitle,t1.subtitle
        ,STUFF(
                   (SELECT
                        ', ' + t2.imagename
                        FROM @YourTable t2
                        WHERE t2.id=t1.id
                        ORDER BY t2.id,t2.imagename,t2.maintitle,t2.subtitle
                        FOR XML PATH(''), TYPE
                   ).value('.','varchar(max)')
                   ,1,2, ''
              ) AS imagenames
    FROM YourTableOrdered t1
    WHERE t1.RowNumber=1
    ORDER BY t1.id

ВЫВОД:

id          maintitle  subtitle   imagenames
----------- ---------- ---------- -------------------------------------------------
1           ram        raman      abc.jpg
2           manu       kiran      a2.jpg, a3.jpg, a4.jpg, a5.jpg, a6.jpg, a7.jpg
3           anu        anitha     a4.jpg, a4.jpg

(3 row(s) affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...