2010-11-24 63 views
0

我有列的表格相似图片和datalike这个迭代通过在2005年SQLSERVER记录格式化输出

现在我需要显示这样的数据:当运行查询

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 

EX输出:我有这样

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行则应该创建的列动态希望我的问题是明确的

可以在任何一个电话我如何解决这个

任何解决方案将是巨大的

+2

您的输出与您的输入不符。你的输出中的part1来自哪里?为什么3会是* anu *而不是* anupam *。我们可以猜出这些东西,但只要提到它会更容易。 – 2010-11-24 13:33:04

回答

2

您的样本数据并不一致您的示例输出。该代码使用您的样本数据,试试这个:

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 

OUTPUT:基于OP的问题编辑提多/未知数量的每个ID文件

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)获得文件的最大数量每一个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 

OUTPUT:

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) 
+0

感谢您的重播我在这里有一个问题,同一个id的行值可以是动态的,所以我必须创建n列基于行 – happysmile 2010-11-24 18:03:57