Вы можете сгруппировать таблицу по ID
и user
, а затем использовать функцию STUFF
, чтобы получить group
в качестве значений, разделенных запятыми
сначала давайте создадим тестовую таблицу, которая соответствует образцу данных из вашего вопроса.
declare @t table (ID int, [user] varchar(10), [group] varchar(10))
insert into @t (ID, [user], [group])
values (1, 'max', 'g1'),
(1, 'max', 'admin'),
(2, 'tom', 'g2'),
(3, 'jan', 'g1'),
(3, 'jan', 'k1'),
(3, 'jan', 'o1')
теперь мы можем запрашивать различные идентификаторы и пользователей, как это
select t.ID,
t.[user]
from @t t
group by t.ID, t.[user]
и это даст нам
ID user
1 max
2 Tom
3 Jan
Теперь все, что нам нужно, это получить группу в виде значения, разделенного запятыми, для каждой строки, и это мы можем сделать с помощью функции stuff.
select t.ID,
t.[user],
stuff( (select ',' + t2.[group] from @t t2 where t2.ID = t.ID for XML path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '') as [group]
from @t t
group by t.ID, t.[user]
результат будет
ID user group
1 max Admin,g1
2 Tom g2
3 Jan g1,K1,O1
Глядя на ваш запрос, я думаю, вы можете реализовать его следующим образом. Я не могу не проверить это, конечно, потому что у меня нет вашей базы данных.
select t.ID,
t.[user],
stuff( (select ',' + t2.[group] from @t t2 where t2.ID = t.ID for XML path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '') as [group]
from ( SELECT server01.customer05.user.id,
server01.customer05.user.namename as [user],
server01.customer05.groups.name as [group]
FROM server01.customer05.username
INNER JOIN customer05.bgrel ON server01.customer05.id=server01.customer05.bgrel.username_id
INNER JOIN customer05.groups ON customer05.groups.id=customer05.bgrel.groups_id
WHERE server01.customer05.username != 'ANONYMOUS'
and server01.customer05.username != 'INST_ROOT'
and server01.customer05.username != 'SERVER_ROOT_3'
) t
group by t.ID, t.[user]