当相同的 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 行数据进入一行数据时,逗号分隔的主要内容,如果未能解决你的问题,请参考以下文章

sql里将重复行数据合并为一行,数据用逗号分隔

cfspreadsheet 在逗号分隔的行插入中转义逗号

SQL逗号分割一列数据的值,将结果变成一行多列

按组的 DB2 逗号分隔输出

FullCalendar - 如何根据逗号分隔的日期从日历上的数据库(mysql)表行显示事件

如何通过逗号分隔将 2 行合并为一行?