我正在尝试编写查询以返回用户,有关他们的一些信息以及将他们分配给哪个安全组。但是,有些用户有多个组,因此我不想返回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
安全组将是唯一具有多行才能满足条件的列(如果重要的话)。
答案 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