2

sqlserver 2005以降を使用して複数の行を1つの行にマージするSQL選択クエリには、2つのテーブル(tb_master、tb_tasks)があります

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

試したクエリ

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

前もって感謝します

4

1 に答える 1

3

このクエリは、tb_master ごとに要求されたアクティビティのリストを作成します。2 つのポインター: 一貫性のある結果を得るには、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にあります。

于 2012-05-05T11:56:07.290 に答える