如何在一列中返回多个值(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。
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。 这里是我发现的一个点击: