如果超过1个符合条件,则将值组合到单个列中

时间:2018-10-04 13:37:45

标签: sql sql-server

我正在尝试编写查询以返回用户,有关他们的一些信息以及将他们分配给哪个安全组。但是,有些用户有多个组,因此我不想返回2行,而是希望合并安全组名称。

terminate

所以没有像这样得到2行:

SELECT  ur.loginname 
       ,ur.firstname 
       ,ur.lastname 
       ,sg.securitygroupname 
       ,jt.description 
FROM    users ur 
       ,usersecuritygroup us 
       ,securitygroup sg
       ,jobtitle jt 
WHERE  ur.doctorfacilityid = us.doctorfacilityid 
       AND us.securitygroupid = sg.securitygroupid 
       AND ur.jobtitle = jt.jtid 

我想这样返回1行:

jdoe     john     doe     group1     xyz
jdoe     john     doe     group2     xyz

安全组将是唯一具有多行才能满足条件的列(如果重要的话)。

1 个答案:

答案 0 :(得分:0)

您可以将查询放入CTE中,并使用XML来连接securitygroupname列中的值;如果使用的是SQL Server 2017,则可以使用STRING_AGG()函数。

with cte as (
    SELECT  ur.loginname 
           ,ur.firstname 
           ,ur.lastname 
           ,sg.securitygroupname 
           ,jt.description 
    FROM    users ur 
           ,usersecuritygroup us 
           ,securitygroup sg
           ,jobtitle jt 
    WHERE  ur.doctorfacilityid = us.doctorfacilityid 
           AND us.securitygroupid = sg.securitygroupid 
           AND ur.jobtitle = jt.jtid
)
-- OLD VERSIONS
select distinct
    loginname
    ,firstname
    ,lastname
    ,STUFF(
        (SELECT
            N', ' + securitygroupname
        FROM cte c
        WHERE loginname = c.loginname
            and firstname = c.firstname
            and lastname = c.lastname
            and description = c.description
        FOR XML PATH(''), type).value('text()[1]', 'nvarchar(max)'), 1, 2, N''
    ) securitygroupname
    ,description
from cte

-- STARTING SQL SERVER 2017
select
    loginname
    ,firstname
    ,lastname
    ,STRING_AGG(securitygroupname, ',') as securitygroupname
    ,description
from cte
group by loginname, firstname, lastname, description