【问题标题】: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 分组

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      相关资源
      最近更新 更多