2012-05-05 47 views
2

SQL SELECT查询这给使用sqlserver的2005和上述 合并多个行成一个单列 我有两个表,即(tb_master,tb_tasks)的Sql多行合并成单个行与特定的图案

create table tb_tasks(
id int IDENTITY(1,1) NOT NULL, 
id_tbmaster int NOT NULL, 
Tasks nvarchar(max) NOT NULL 
) 

create table tb_master(
id int IDENTITY(1,1) NOT NULL, 
grade nchar(10) NOT NULL, 
name nvarchar(50) NOT NULL, 
task_date datetime NOT NULL, 
) 

select * from tb_master 
id grade name task_date 
1 A  John 2012-02-13 10:40:00.000 
2 B  Tom 2012-02-13 10:40:00.000 


select tb_tasks 
id id_tbmaster Tasks 
1  1   cooking food. 
2  1   Programing 2 hours 
3  1   Attending meeting 
4  2   Driving car 
5  2   hangout with friends 

试过这个查询

select tasks + ' , ' as 'data()' from tb_tasks for xml path('') 

给人输出

XML 
cooking food , Programing 2 hours , Attending meeting , Driving car , hangout with friends , 

我需要输出像

id Name grade task_date    tasksDetails 
1 John A 2012-02-13 10:40:00.000 1)cooking food, 2)Programing 2 hours, 3)Attending meeting 
2 Tom B 2012-02-13 10:40:00.000 1) Driving car, 2)hangout with friends 

查询我试图提前

+0

+1对于DDL和数据。 –

+0

@BogdanSahlean:thnkx –

回答

3

select a.name,a.task_date,b.tasks =replace(select (CONVERT(VARCHAR,(ROW_NUMBER() OVER(ORDER BY id DESC)))) + ') ' + tasks + ' , ' as 'data()' 
from tb_tasks for xml path('')) 
from tb_master a inner join tb_tasks b 
on a.id=b.id_tbmaster 

感谢这个查询将创建的每tb_master活动要求名单。两个指针:一个应匹配row_number()over()和查询中的排序以获得一致结果,最后一行OUTER APPLY中的数字3是分隔符中的字符数(在本例中为',')。如果你改变分隔符,你需要调整这个数字。

select a.name,a.task_date, b.taskList 
from tb_master a 
OUTER APPLY 
(
    select stuff ((select ' , ' 
         + CONVERT(VARCHAR(10), ROW_NUMBER() 
                OVER(ORDER BY id DESC)) 
         + ') ' 
         + tasks 
        from tb_tasks b 
        where a.id = b.id_tbmaster 
        order by id desc 
       for xml path ('')) 
       , 1, 3, '') taskList 
) b 

现场演示在Sql Fiddle

+0

谢谢你,先生,请节省我的时间,好的解释 –