连接来自单个表中重复行的值的 SQL 查询

yel*_*ood 5 sql-server-2008 sql-server aggregate

假设我有一个表employees,如下所示:

Name     Sex     Role

Bob      M       Developer
Joe      M       QA
Run Code Online (Sandbox Code Playgroud)

现在,我在这个表中遇到了重复行的问题。我会在某个时候修复它,但这不是问题。我目前需要的是查询这样一个表的东西:

Name     Sex     Role

Bob      M       Developer
Bob      M       Janitor
Joe      M       QA
Joe      M       CEO
Run Code Online (Sandbox Code Playgroud)

并将输出以下行:

Name     Role

Bob      Developer, Janitor
Joe      QA, CEO
Run Code Online (Sandbox Code Playgroud)

对我来说,“角色”将被拆分为单独的列还是具有多个值的单个列,这对我来说并不重要。

如果重要,请使用 SQL Server 2008。

Mar*_*ian 7

MySQL 中的 Group_concat 在 SQL Server 2016 之前的 SQL Server 中不可用。 vNext 将引入STRING_AGG但提供等效功能。

不过,您有一些手动选项:

  • 构建一个标量函数,该函数将员工姓名/id 作为参数并显示连接的角色值并将此函数应用于每个员工
  • 使用 xml 函数
  • 使用已经构建的聚合(类似于第一个选项)

您当前案例的解决方案(只是从 SO 中获取 Brad 的答案并为您的桌子定制)将是:

SELECT name, LEFT(roles , LEN(roles )-1) AS roles
FROM employee AS extern
CROSS APPLY
(
    SELECT role + ','
    FROM employee AS intern
    WHERE extern.name = intern.name
    FOR XML PATH('')
) pre_trimmed (roles)
GROUP BY name, roles;
Run Code Online (Sandbox Code Playgroud)

这些详细信息是从不同来源收集的: