如何在一个列中返回多个值(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查询将不胜感激:)
解决方案
group_concat()听起来像我们要找的东西。
http://dev.mysql.com/doc/refman/5.0/zh-CN/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
我们可以使用光标在行中循环并追加到临时表中的字段,也可以使用COALESCE函数来连接字段。
抱歉,第一次读错问题。我们可以执行以下操作:
declare @result varchar(max) --must "initialize" result for this to work select @result = '' select @result = @result + alias FROM aliases WHERE username='Bob'
看看StackOverflow上已经有这个线程,它很方便地为我们提供了一个T-SQL示例。
我的老板在2003年就这样写过一篇文章:与COALESCE串联
我们可以将函数与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
这是不需要UDF即可完成所需工作的最快,最简单的方法之一:
http://weblogs.sqlteam.com/mladenp/archive/2007/06/01/60220.aspx
还有一种使用数字表的方法,该方法对于大型数据集来说速度更快,但我认为我们不需要。
好吧...我看到一个答案已经被接受了...但是我认为无论如何我们应该看到另一个解决方案:
/* 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 */
DECLARE @Str varchar(500) SELECT @Str=COALESCE(@Str,'') + CAST(ID as varchar(10)) + ',' FROM dbo.fcUser SELECT @Str