SQL как поставить значения в одну строку - PullRequest
0 голосов
/ 27 мая 2020

Необходимо, чтобы во втором столбце в одной строке были все связанные учетные записи.

Это показывает ошибку

Ошибка преобразования при преобразовании значения varchar ',' в тип данных int.

SELECT [UserID],
STUFF((SELECT ', ' + UserID
FROM #RelatedIDs
WHERE (UserID = t.UserID)
FOR XML PATH('')) ,1,1,'') AS RelIDs
FROM #RelatedIDs t
GROUP BY UserID

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Вы можете cast целочисленное значение для varchar:

SELECT [UserID],
STUFF((SELECT ',' + CAST(UserID as VARCHAR(100))
FROM #RelatedIDs
WHERE (UserID = t.UserID)
FOR XML PATH('')) ,1,1,'') AS RelIDs
FROM #RelatedIDs t
GROUP BY UserID

Если вы используете последнюю версию SQL Server (2017 или выше), вы можете получить тот же результат в гораздо менее запутанный способ с string_agg():

SELECT t.UserID, STRING_AGG(r.UserID, ',') RelIDs
FROM #RelatedIDs t
INNER JOIN #RelatedIDs r on r.UserID = t.UserID
GROUP BY t.UserID

С таким запросом ясно видно, что он не имеет большого смысла. Самосоединение работает с тем же столбцом, что и столбец, определяющий группу, поэтому это просто сгенерирует список идентичных UserID s в столбце RelIDs (по одному на каждый случай данного UserID в исходном запросе) .

0 голосов
/ 27 мая 2020

Используйте CONCAT() вместо +:

SELECT [UserID],
       STUFF((SELECT CONCAT(', ', UserID)
              FROM #RelatedIDs ri
              WHERE ri.UserID = t.UserID
              FOR XML PATH('')
             ), 1, 2, '') AS RelIDs
FROM #RelatedIDs t
GROUP BY UserID;

Обратите внимание, что я также изменил аргументы материала с 1, 1 на 1, 2. Это потому, что у вас есть пробел после запятой.

Ваше предложение корреляции также предполагает, что результаты не будут очень интересными, когда вы заставите это работать.

...