Как вернуть несколько значений в один столбец (T-SQL)?
У меня есть таблица UserAliases
(UserId, Alias
) с несколькими псевдонимами для каждого пользователя. Мне нужно запросить его и вернуть все псевдонимы для данного пользователя, трюк состоит в том, чтобы вернуть их все в один столбец.
Пример:
UserId/Alias
1/MrX
1/MrY
1/MrA
2/Abc
2/Xyz
Я хочу, чтобы результат запроса был в следующем формате:
UserId/Alias
1/ MrX, MrY, MrA
2/ Abc, Xyz
Спасибо.
Я использую SQL Server 2005.
p.s. фактический запрос T-SQL будет оценен:)
Ответы
Ответ 1
Вы можете использовать функцию с COALESCE.
CREATE FUNCTION [dbo].[GetAliasesById]
(
@userID int
)
RETURNS varchar(max)
AS
BEGIN
declare @output varchar(max)
select @output = COALESCE(@output + ', ', '') + alias
from UserAliases
where userid = @userID
return @output
END
GO
SELECT UserID, dbo.GetAliasesByID(UserID)
FROM UserAliases
GROUP BY UserID
GO
Ответ 2
Ну... я вижу, что ответ уже принят... но я думаю, что вы все равно должны увидеть другие решения:
/* EXAMPLE */
DECLARE @UserAliases TABLE(UserId INT , Alias VARCHAR(10))
INSERT INTO @UserAliases (UserId,Alias) SELECT 1,'MrX'
UNION ALL SELECT 1,'MrY' UNION ALL SELECT 1,'MrA'
UNION ALL SELECT 2,'Abc' UNION ALL SELECT 2,'Xyz'
/* QUERY */
;WITH tmp AS ( SELECT DISTINCT UserId FROM @UserAliases )
SELECT
LEFT(tmp.UserId, 10) +
'/ ' +
STUFF(
( SELECT ', '+Alias
FROM @UserAliases
WHERE UserId = tmp.UserId
FOR XML PATH('')
)
, 1, 2, ''
) AS [UserId/Alias]
FROM tmp
/* -- OUTPUT
UserId/Alias
1/ MrX, MrY, MrA
2/ Abc, Xyz
*/
Ответ 3
Посмотрите fooobar.com/questions/6656/..., он удобно дает вам пример T-SQL.
Ответ 4
Мой босс написал статью на этом пути в 2003 году: Конкатенация с COALESCE
Ответ 5
это один из самых быстрых и простых способов сделать то, что вам нужно, без необходимости в UDF:
http://weblogs.sqlteam.com/mladenp/archive/2007/06/01/60220.aspx
есть еще один способ, используя таблицу чисел, которая быстрее для действительно больших наборов данных, но я не думаю, что вам это понадобится.
Ответ 6
DECLARE @Str varchar(500)
SELECT @Str=COALESCE(@Str,'') + CAST(ID as varchar(10)) + ','
FROM dbo.fcUser
SELECT @Str
Ответ 7
Вы можете либо прокручивать строки с помощью курсора, либо присоединяться к полю в таблице temp, либо вы можете использовать функцию COALESCE для объединения полей.
Ответ 8
Извините, прочитайте вопрос неправильно в первый раз. Вы можете сделать что-то вроде этого:
declare @result varchar(max)
--must "initialize" result for this to work
select @result = ''
select @result = @result + alias
FROM aliases
WHERE username='Bob'
Ответ 9
group_concat() звучит так, как будто вы ищете.
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
поскольку вы находитесь на mssql, я просто googled "group_concat mssql" и нашел кучу хитов, чтобы воссоздать функциональность group_concat. здесь один из найденных мной хитов:
http://www.stevenmapes.com/index.php?/archives/23-Recreating-MySQL-GROUP_CONCAT-In-MSSQL-Cross-Tab-Query.html