Вывести строку значения в столбец в SQL Server - PullRequest
0 голосов
/ 27 октября 2018

У меня есть таблица с этими примерами записей:

CREATE TABLE USERROLES(User ID int,ApplicationID int,Roleid INT) 

INSERT INTO USERROLES
VALUES (11, 1, 1), (11, 1, 5), (11, 3, 5);

Я хочу отобразить вывод ниже.

USERID  ApplicationID   Roles
-----------------------------
11         1             1,5
11         3              5

ApplicationID = 1 - дубликаты для ROLES 1,5. Так чтодолжен отображаться в одном ряду.Я использую SQL Server 2016

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Вы можете попробовать следующий запрос

    SELECT DISTINCT UserID, ApplicationID, Roles = 
    STUFF((SELECT ', ' + CAST(Roleid as Varchar)
           FROM userroles b 
           WHERE b.UserID = a.UserID and a.ApplicationID = b.ApplicationID 
          FOR XML PATH('')), 1, 2, '')
FROM userroles a
GROUP BY UserID, ApplicationID, Roleid

Надеюсь, это поможет вам.

0 голосов
/ 31 октября 2018
Sometime adding other string with comma add extra space between both, so use
FOR XML PATH('')), 1, 1, '')

вместо

 FOR XML PATH('')), 1, 2, '')

, как показано ниже, и уберите пробел после запятой, например ','

SELECT DISTINCT UserID, ApplicationID, Roles = 
    STUFF((SELECT ',' + CAST(Roleid as Varchar)
           FROM userroles b 
           WHERE b.UserID = a.UserID and a.ApplicationID = b.ApplicationID 
          FOR XML PATH('')), 1, 1, '')
FROM userroles a
GROUP BY UserID, ApplicationID, Roleid
0 голосов
/ 27 октября 2018

Вы можете попробовать использовать STUFF с FOR XML let Roleid объединить.

 SELECT 
  UserID,
  ApplicationID,
  STUFF((
    SELECT ',' + cast(Roleid as varchar(max))
    FROM USERROLES tt
    WHERE ApplicationID = t1.ApplicationID
    FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
  ,1,1,'') AS Roles
FROM USERROLES t1
group by 
  UserID,
  ApplicationID

sqlfiddle

Результат

serID   ApplicationID   Roles
11       1              1,5
11       3              5
...