2

我有一个 SQL Server 2005 表,它记录了一个过程的每个步骤,如下所示

时间名称

08.40 Sarah
09.00 Nafira
09.00 Sarah
09.00 Denur
10.00 MuLyono
10.00 Lucky
08.30 MaLa
08.35 Mara

我想做的是显示一个结果,每个 ResourceID 都有一行,显示每个事件的时间。

时间名称

08.30 MaLa
08.35 Mara
08.40 Sarah
09.00 Nafira, Sarah, Denur
10.00 MuLyono, Lucky

关于如何做到这一点的任何建议?感谢阅读和回答^_^

4

2 回答 2

2

尝试这个。我已经测试过它并且它正在工作。

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 运算符生成的列列表是左侧输入中的一组列,后跟右侧输入返回的列列表。

虽然“交叉申请”为,

CROSS APPLY 仅返回外部表中从表值函数生成结果集的行。

只是将LEFT(Names , LEN(Names )-1)结果字符串修剪一个字符,即删除末尾多余的逗号。

于 2013-10-25T11:38:40.657 回答
0

我将您的 sql 代码修改为这样,这就是我想要的工作。

select c1.Time,
stuff((select distinct ', '+cast(Nama as varchar(200))
from tbclientdata c2 where c2.time=c1.time
for xml path('')),1,1,'')
从 tbclientdata c1
按 c1.Time 分组

于 2013-10-26T09:47:32.830 回答