将多行合并为一列,同时用原始表中的“名称”字段替换键

Posted

技术标签:

【中文标题】将多行合并为一列,同时用原始表中的“名称”字段替换键【英文标题】:Merge multiple rows into a column while replacing the keys with a 'name' field from the original table 【发布时间】:2022-01-22 06:53:42 【问题描述】:

我有一个连接表,其中包含“account_id”和“group id”,两者均由 GUID 表示。我正在尝试合并列,以便我们得到一个“account_id”,其中所有“group_id”都合并到一个列/行,但显示帐户和组的实际名称。

表格 帐号

account_id   Name
1            Henry
2            Smith

Group_id   Group_nameName
3            User
4            Admin

Account_Group_Join_Table

account_id   group_id
1            3
1            4
2            3

期望的结果:

Name    Groups
Henry   Dev,User
Smith   User, Admin

到目前为止的代码返回 'account_id' 和 'group_id' 分组到单行/列

select account_id,
  stuff((SELECT distinct ', ' + group_id
           FROM account_group_join t2
           where t2.account_id = t1.account_id
           FOR XML PATH('')),1,1,'') [Groups]
from account_group_join t1
group by account_id

【问题讨论】:

FOR XML PATH('')) 应该是 FOR XML PATH(''), TYPE).value('text()[1]','nvarchar(max)') 以避免 XML 转义,,1,1,'' 应该是 ,1,2,'' 或任何长度的分隔符 【参考方案1】:

您只需在子查询中加入您的组表,这样您就可以获得名称而不是 ID。您也可以在外部查询中从Account 中选择,避免额外加入帐户来获取名称:

SELECT  a.account_id,
        a.Name,
      STUFF((SELECT DISTINCT ', ' + g.group_nameName
               FROM account_group_join AS ag
                    INNER JOIN [Group] AS g
                        ON g.group_id = ag.group_id
               WHERE ag.account_id = a.account_id
               FOR XML PATH('')),1,1,'') AS [Groups]
from Account AS a;

n.b.我已将您的别名从 t1t2 更改为代表我正在别名的表的东西,您会发现这更容易,尤其是在处理较大的查询时。更多阅读:Bad Habits to Kick : Using table aliases like (a, b, c) or (t1, t2, t3)

【讨论】:

以上是关于将多行合并为一列,同时用原始表中的“名称”字段替换键的主要内容,如果未能解决你的问题,请参考以下文章

将多行中的多个文本字段分组为一列[重复]

sql数据库中,如何将一个表中的多列数字合并为一列

我可以用逗号将多行分隔为一列吗? [复制]

MySQL关联表多行转多列?

将不同行中的值合并为一列

sql [sql]将多行合并并组合成一个,同时用其他数据替换NULL值。