【问题标题】:SQL Rows with intended duplicate IDs - How to join them up?具有预期重复 ID 的 SQL 行 - 如何将它们连接起来?
【发布时间】:2021-04-18 15:35:37
【问题描述】:

我有一些连接在一起的用户和部门表,但前端可以选择包含多个“领导”电子邮件地址。

理想情况下,我希望将这些在主数据集中分开;但是,在报告视图上,我想让他们全部加入。

数据当前的样子

ID Name
157 Bob
157 James
300 Phil
300 Keith
300 Paul

我希望它看起来如何

ID Name
157 Bob, James
300 Phil, Keith, Paul

或者在不同的列中,以最简单的为准。

当前代码与下面类似。

Select 
TU.ID, 
TUbyDept.FirstName, 
TU.LastAccessData

FROM USERDATA UD
LEFT JOIN DepartmentData DD 
    ON UD.DepartmentID = DD.ID

LEFT JOIN UserData UDByDept ON DD.id = UDByDept.DepartmentID

任何帮助将不胜感激,因为到目前为止我所尝试的一切都不太顺利!

使用 SSMS 2016

【问题讨论】:

    标签: sql join duplicates string-aggregation ssms-2016


    【解决方案1】:

    如果您的 SQL Server 早于 SQL Server 2017,那么这样的东西应该可以解决问题。

    WITH userlist (ID,[Name])
    AS (SELECT ID,[Name] FROM YourSourceTable)
    SELECT ID,
    STUFF((SELECT [Name] + ',' 
        FROM userlist
        WHERE ID=users.ID
        FOR XML PATH(''))
        ,1,2,'')
    FROM userlist users
    GROUP BY ID;
    

    我使用了公用表表达式,因为我不确定您的原始未聚合/连接的源代码是什么样的。因此,基本上只需将我的代码中的“SELECT ID,[Name] FROM YourSourceTable”替换为您的第一个表的实际源代码(“数据当前的外观”)。

    使用 SQL Server 2017 及更高版本会轻松得多,因为它们带有 STRING_AGG() 函数。 More on this on MSDN.

    【讨论】:

      【解决方案2】:

      可能有点老套,可能只适用于较小的数据集:

      declare @x as xml=(select id,[name] from userdata for xml raw);
      with distinctusers as
      (
        select id from userdata group by id
      )
      select 
        d.id,
        x.t.query('row[@id=sql:column("id")]').query('distinct-values(row/@name)')
      
        from distincusers d
        outer apply @x.nodes('.') as x(t)
      

      【讨论】:

        猜你喜欢
        • 2016-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 2014-06-01
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多