将多行的结果分组到一列中

10 浏览
0 Comments

将多行的结果分组到一列中

下面的查询给出了两个结果,除了最后一列v2_roles.id之外,其他都相同。有没有办法将它们分组在一列中(可能是逗号分隔的列表),并只返回一个结果呢?

0
0 Comments

这是一个使用FOR XML将字段转换为列表并使用STUFF去除开头逗号的小技巧 - 这应该是接近的解决方法(未经测试):

SELECT v2_admin.adminid, 
       v2_admin.adminname, 
       v2_admin.login, 
       v2_admin.email, 
       STUFF(
        (
            SELECT ',' +  CAST(v2_roles.id as varchar) AS [text()]
                FROM v2_roles
                WHERE v2_admin_roles.roleid = v2_roles.id 
            ORDER BY v2_roles.id
            FOR XML PATH('')
        ), 1, 1, '') AS Roles
FROM   v2_admin 
       INNER JOIN v2_admin_roles 
               ON v2_admin.adminid = v2_admin_roles.adminid 
WHERE  v2_admin.adminid = 2 
GROUP BY v2_admin.adminid, 
       v2_admin.adminname, 
       v2_admin.login, 
       v2_admin.email

谢谢你的回答,但是它给出了错误-在将varchar值“,”转换为int数据类型时转换失败。

将你的Roles.Id进行类型转换-等一下,我会修改...

-参见编辑-你只需要将int转换为varchar-祝你好运!

抱歉,但它仍然给我两行。KAF上面的回答提供了解决我的问题的解决方案。谢谢

-没关系-看起来我忘记了GROUP BY-主键(对我们两个人的答案来说)使用FOR XML 🙂 -很高兴我们能帮到你...

0
0 Comments

问题的出现原因:在需要将多个行的结果合并成一列时,使用了GROUP BY语句,但是由于GROUP BY只能用于聚合函数,无法直接将多个行的结果合并成一列。

解决方法:使用子查询和XML PATH函数来实现将多个行的结果合并成一列的功能。具体方法是在子查询中使用FOR XML PATH('')语句将多个行的结果拼接成一个XML字符串,然后使用REPLACE函数将空格替换为逗号,最后将结果命名为roleIds。在外层查询中使用GROUP BY语句对adminid、adminname、login和email进行分组,并将roleIds作为合并后的结果列进行查询。

0