当相同的 id 行数据进入一行数据时,逗号分隔
Posted
技术标签:
【中文标题】当相同的 id 行数据进入一行数据时,逗号分隔【英文标题】:Comma separated when same id rows data into in one row data 【发布时间】:2020-08-08 15:15:10 【问题描述】:我需要有关我所附屏幕截图的帮助。
场景:一个用户可以拥有多个角色。因此,在屏幕截图中,相同的用户 ID 具有不同的 rowid 和 rolename。我想将它们显示在单行中,就像我在屏幕截图中显示的那样作为所需的结果。
SELECT
ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS Id,
U.UserId, U.FirstName, U.LastName,
(U.FirstName + ' ' + U.LastName) AS FullName,
u.email, u.PhoneNumber, u.Username,
COALESCE(RR.RoleId, PU.RoleId, sbr.RoleId) AS RoleId,
COALESCE(RR.RoleName, R.RoleName,sbr.RoleName) AS RoleName,
COALESCE(RR.RoleType, R.RoleType,sbr.RoleType) AS RoleType, u.[Image]
FROM
[User] U
LEFT JOIN
PlatformUser PU ON PU.UserId = u.UserId AND PU.IsDeleted <> 1
LEFT JOIN
Role R ON R.RoleId = PU.RoleId
LEFT JOIN
UserToSchool UTS ON UTS.UserId = u.UserId AND UTS.IsDeleted <> 1
LEFT JOIN
Role RR ON RR.RoleId = UTS.RoleId
LEFT JOIN
dbo.UserToSchoolBranch usb ON usb.UserId = u.UserId AND usb.IsDeleted <> 1
LEFT JOIN
dbo.Role sbr ON sbr.RoleId = usb.RoleId
WHERE
(RR.RoleType = @pRoleType OR R.RoleType = @pRoleType OR sbr.RoleType = @pRoleType)
AND ISNULL(u.isdeleted, 0) <> 1
【问题讨论】:
不确定我是否理解为什么输出中是 321 而不是 323?用户 1 和用户 3046 之间是否存在一些对我们来说并不明显的关系?此外,请始终指定您使用的 SQL Server 版本...只有 9 个主要版本可供选择,并且某些版本具有其他版本没有的相关功能。只是说“SQL Server”就像我去垃圾场说我需要一个宝马的方向盘。他们将需要拔牙才能给我所要求的帮助。 在 SQL Server 2017 及更高版本中,您可以使用 STRING_AGG 轻松连接行。在早期版本中,您需要一个复杂的查询。你用的是哪个版本? @PanagiotisKanavos 首先感谢您的快速回复。场景是一个用户可以分配多个角色,请查看用户 ID 3046 有两个角色,分两行。我安装了两个版本的 sqlserver 2017 和 sql服务器 2008R2 但我在 2017 年工作。 @OlgaRomantsova 由于声誉低下,我无法投票,甚至无法查看答案... 【参考方案1】:如果您的查询 AS cte,那么您可以使用 FOR XML PATH()
获取一行:
with cte as
(
your query
)
select distinct UserId, FirstName, LastName, FullName, email, PhoneNumber, Username,
stuff((select Concat(',',RoleId)
from cte cte1
where cte1.UserId = cte2.UserId
for xml path('')),1,1,'') All_roles_Id,
stuff((select Concat(',',RoleName)
from cte cte1
where cte1.UserId = cte2.UserId
for xml path('')),1,1,'') All_roles_name
from cte cte2
或者你可以尝试使用String_AGG
(SQl server 2017):
select UserId, FirstName, LastName, FullName, email, PhoneNumber, Username,
string_agg(RoleId,',') All_roles_Id,
string_agg(RoleName,',') All_roles_Name
from cte
group by UserId, FirstName, LastName, FullName, email, PhoneNumber, Username
【讨论】:
ManDark,请告诉我。你试试看? 是的,我试过了,但没有达到我的预期。因为这个函数 string_agg 需要 group by 子句,我不能用它。 什么意思?在组内选项? 如果我使用这个函数 string_agg 这会强制我使用 group by 子句 ManDark,但我写了 2 个查询..在第二个查询中,这个函数存在并且还有 group by...以上是关于当相同的 id 行数据进入一行数据时,逗号分隔的主要内容,如果未能解决你的问题,请参考以下文章