如何在一列中返回多个值(T-SQL)?

我有一个表UserAliasesUserId, 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。

ps实际的T-SQL查询将不胜感激:)

您可以使用COALESCE的function。

 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 

那么…我看到一个答案已经被接受了…但是我认为你应该看到另一个解决scheme:

 /* 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 */ 

看看这个线程已经在StackOverflow上 ,它方便地给你一个T-SQL的例子。

我的老板在这条路上写了一篇文章2003: 与COALESCE联合

这是在不需要UDF的情况下执行所需操作的最快和最简单的方法之一: http : //weblogs.sqlteam.com/mladenp/archive/2007/06/01/60220.aspx

还有一种方法是使用数字表格,对于大数据集来说速度更快,但我不认为你需要这样做。

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

您可以使用游标循环访问行并追加到临时表中的字段,也可以使用COALESCE函数来连接字段。

对不起,第一次读错了问题。 你可以做这样的事情:

 declare @result varchar(max) --must "initialize" result for this to work select @result = '' select @result = @result + alias FROM aliases WHERE username='Bob' 

group_concat()听起来像你在找什么。

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

因为你在mssql上,我只是search“group_concat mssql”,并发现一堆点击来重新创buildgroup_concatfunction。 这里是我发现的一个点击:

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