2013-10-25 81 views
2

我有一个SQL Server 2005的表记录了过程的每个步骤如下图所示SQL 2005将多个记录到一个

时间 名称

08.40  萨拉
09.00   Nafira
09.00   Sarah
09.00   Denur
10.00   MuLyono
10.00  幸运
08.30  玛拉
08.35  马拉

我想这样做是显示对每一个显示为每个事件的时间的ResourceID一行的结果。

时间 名称

08.30  玛拉
08.35  马拉
08.40  萨拉
09.00   Nafira,萨拉,Denur
10.00   MuLyono,幸运

任何建议如何实现这一目标?感谢阅读和回答^ _^

+0

我认为[这可以帮助](http://stackoverflow.com/questions/451415/simulating -group-concat-mysql-function-in-microsoft-sql-server-2005) – valex

回答

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”为,

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

LEFT(Names , LEN(Names)-1)只是将结果字符串修剪一个字符,即在最后删除额外的逗号。

0

我修改你的sql代码就像这样,这是像我想要的工作。

选择c1.Time,
东西((选择不同 '' +铸造(NAMA为varchar(200))
从tbclientdata C2其中c2.time = c1.time
用于XML路径( '')),1,1, '')
从tbclientdata C1
组由c1.Time

+0

然后将你的答案标记为'回答'。它会帮助别人。 – P5Coder