为每个不同的名称值连接不同的姓氏值

Posted

技术标签:

【中文标题】为每个不同的名称值连接不同的姓氏值【英文标题】:Concatenate distinct surname values for each distinct name value 【发布时间】:2021-01-04 07:41:47 【问题描述】:

我想要实现的是每个 DISTINCT 名称值的所有 DISTINCT 姓氏值的串联。

我所管理的是 DISTINCT 名称值的串联,但不幸的是所有姓氏值。

下面是我的代码:

SELECT DISTINCT ST2.[Name], 
    SUBSTRING(
        (
            SELECT ','+ST1.Surname  AS [text()]
            FROM [Ext_Names] ST1
            WHERE ST1.[Name] = ST2.[Name]
            ORDER BY ST1.[Name]
            FOR XML PATH ('')
        ), 2, 1000) [Surname]
FROM [Ext_Names] ST2

样本数据

结果

期望的输出

【问题讨论】:

仅供参考,如果您的列表长度超过 1000 个字符,这将截断您的数据。与其使用SUBSTRING 取最右边的字符,不如使用STUFF 删除第一个字符。 【参考方案1】:

您需要先选择不同的值,然后再聚合。如果您运行的是 SQL Server 2017 或更高版本,则可以使用string_agg()

select name, string_agg(surname, ',') within group (order by surname) surnames
from (select distinct name, surname from ext_names) t
group by name

【讨论】:

我收到一个错误Column 't.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 错误告诉你问题,@Error1004。很明显,GMB 忘记添加 GROUP BY,但错误告诉您以及如何修复它;) @Larnu 我只是在最后添加GROUP BY name 它似乎有效。但我不确定这是我要求确认的方式 谢谢你们!真的很感激。 如果我的 SQL Server 版本低于 2017,您有什么建议?【参考方案2】:

你可以做到这一点。

SELECT DISTINCT ST2.[Name], SUBSTRING((SELECT  ','+ T.Surename  AS [text()] FROM (SELECT DISTINCT ST1.Surename FROM Ext_Names ST1 WHERE ST1.Name = ST2.Name  ) T ORDER BY T.Surename FOR XML PATH('')),2,1000) [SureEname]
FROM Ext_Names ST2

【讨论】:

以上是关于为每个不同的名称值连接不同的姓氏值的主要内容,如果未能解决你的问题,请参考以下文章

使用连接时为每个不同的字段值选择随机行

mongoose - 呈现不同的值并消除这些值

MariaDB 根据列值连接来自不同数据库的表

根据 INNER JOIN 中的 SESSION 值显示两个不同的值

允许为不同的参数值分别实现功能的功能的名称是啥?

为具有不同名称和不同@class 属性值的多个元素创建一个包装器元素