将多行合并为一列,同时用原始表中的“名称”字段替换键
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.我已将您的别名从 t1
和 t2
更改为代表我正在别名的表的东西,您会发现这更容易,尤其是在处理较大的查询时。更多阅读:Bad Habits to Kick : Using table aliases like (a, b, c) or (t1, t2, t3)
【讨论】:
以上是关于将多行合并为一列,同时用原始表中的“名称”字段替换键的主要内容,如果未能解决你的问题,请参考以下文章