Как вернуть несколько значений в одном столбце (T-SQL)? - PullRequest
44 голосов
/ 23 сентября 2008

У меня есть таблица 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:)

Ответы [ 9 ]

55 голосов
/ 23 сентября 2008

Вы можете использовать функцию с 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
17 голосов
/ 07 октября 2008

Ну ... я вижу, что ответ уже был принят ... но я думаю, что вы все равно должны увидеть другие решения:

/* 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 голосов
/ 24 сентября 2008

это один из самых быстрых и простых способов сделать то, что вам нужно, без необходимости использования UDF: http://weblogs.sqlteam.com/mladenp/archive/2007/06/01/60220.aspx

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

3 голосов
/ 23 сентября 2008

Посмотрите на этот поток уже в StackOverflow , он удобно дает вам пример T-SQL.

2 голосов
/ 23 сентября 2008

Мой начальник написал статью об этом в 2003 году: Объединение с COALESCE

1 голос
/ 21 мая 2009
DECLARE @Str varchar(500)

SELECT @Str=COALESCE(@Str,'') + CAST(ID as varchar(10)) + ','
FROM dbo.fcUser

SELECT @Str
0 голосов
/ 23 сентября 2008

Извините, прочитайте вопрос неправильно в первый раз. Вы можете сделать что-то вроде этого:

declare @result varchar(max)

--must "initialize" result for this to work
select @result = ''

select @result = @result + alias
FROM aliases
WHERE username='Bob'
0 голосов
/ 23 сентября 2008

Вы можете либо циклически проходить по строкам с помощью курсора и добавлять к полю во временной таблице, либо использовать функцию COALESCE для объединения полей.

0 голосов
/ 23 сентября 2008

group_concat () звучит как то, что вы ищете.

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

так как вы находитесь на mssql, я просто гуглил "group_concat mssql" и нашел несколько совпадений, чтобы воссоздать функциональность group_concat. Вот один из найденных хитов:

http://www.stevenmapes.com/index.php?/archives/23-Recreating-MySQL-GROUP_CONCAT-In-MSSQL-Cross-Tab-Query.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...