【问题标题】:SQL 2005 Combine multiple record into oneSQL 2005 将多条记录合并为一条
【发布时间】:2013-10-25 11:21:18
【问题描述】:
我有一个 SQL Server 2005 表,记录了流程的每个步骤,如下所示
时间名称
08.40 莎拉
09:00 纳菲拉
09:00 莎拉
09:00 迪努尔
10.00 穆里约诺
10.00 幸运
08.30 马拉
08.35 马拉
我想做的是显示一个结果,其中每个 ResourceID 都有一行显示每个事件的时间。
时间名称
08.30 马拉
08.35 马拉
08.40 莎拉
09:00 纳菲拉、莎拉、德努尔
10.00 穆里约诺,幸运
关于如何完成此任务的任何建议?感谢阅读和回答^_^
【问题讨论】:
标签:
sql
sql-server-2005
multiple-records
【解决方案1】:
试试这个。我已经测试过它并且它正在工作。
SELECT t.Time, LEFT(Names , LEN(Names )-1) as Names
FROM yourtable t
CROSS APPLY
(
SELECT t1.Name + ','
FROM yourtable t1
WHERE t.Time= t1.Time
FOR XML PATH('')
) pre_trimmed (Names)
GROUP BY Time, Names;
如您所见,NAME 列的字符串连接是使用 CROSS APPLY 完成的。 http://technet.microsoft.com 将 'APPLY' 定义为
APPLY 运算符允许您为查询的外部表表达式返回的每一行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。对来自左输入的每一行评估右输入,并将生成的行组合起来作为最终输出。 APPLY 运算符生成的列列表是左侧输入中的列集合,后跟右侧输入返回的列列表。
当“交叉应用”时,
CROSS APPLY 仅返回外部表中从表值函数产生结果集的行。
LEFT(Names , LEN(Names )-1) 只是将结果字符串修剪一个字符,即删除末尾多余的逗号。
【解决方案2】:
我将你的 sql 代码修改成这样,这是我想要的工作。
选择 c1.Time,
stuff((select distinct ', '+cast(Nama as varchar(200))
来自 tbclientdata c2 其中 c2.time=c1.time
对于 xml 路径('')),1,1,'')
来自 tbclientdata c1
按 c1.Time 分组