Sql server 迭代处理SQLServer2005中的记录以格式化输出

Sql server 迭代处理SQLServer2005中的记录以格式化输出,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,我有一个表,其中有这样的列和这样的数据 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

我有一个表,其中有这样的列和这样的数据

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')  
现在,我需要在运行查询时显示这样的数据

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
需要检查id,如果它存在多行,则使用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行,所以我必须创建6列。如果它有4行,那么应该动态创建for列,希望我的问题是清楚的

有人能告诉我怎么解决这个问题吗


任何解决方案都很好

您的样本数据与样本输出不一致。此代码使用示例数据,请尝试以下操作:

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)

编辑基于OP的问题编辑,提及每个id的文件数量很多/未知

您有三种选择:

1)用足够多的
左连接对固定查询进行编码,如:

;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)获取每个id的最大文件数,然后构建包含该连接数的动态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)

您的输出与输入不匹配。输出中的第1部分来自哪里?为什么3是anu而不是anupam。我们可以猜测这些事情,但只提及它会更容易。感谢重播,我这里有一个问题,相同id的行值可以是动态的,因此我必须基于行创建n个列