J'ai une table UserAliases
(UserId, Alias
) avec plusieurs alias par utilisateur. J'ai besoin de l'interroger et de retourner tous les alias d'un utilisateur donné, l'astuce consiste à les renvoyer tous dans une seule colonne.
Exemple:
UserId/Alias
1/MrX
1/MrY
1/MrA
2/Abc
2/Xyz
Je veux le résultat de la requête au format suivant:
UserId/Alias
1/ MrX, MrY, MrA
2/ Abc, Xyz
Merci.
J'utilise SQL Server 2005.
p.s. une requête T-SQL réelle serait appréciée :)
Vous pouvez utiliser une fonction avec 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
Eh bien ... je vois qu'une réponse a déjà été acceptée ... mais je pense que vous devriez quand même voir une autre solution:
/* 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
*/
c'est l'un des moyens les plus rapides et les plus simples de faire ce dont vous avez besoin sans avoir besoin d'un FDU: http://weblogs.sqlteam.com/mladenp/archive/2007/06/01/60220.aspx =
il y a une autre façon d'utiliser une table de nombres qui est plus rapide pour les très grands ensembles de données, mais je ne pense pas que vous en aurez besoin.
Jetez un oeil à ce fil déjà sur StackOverflow , il vous donne commodément un exemple T-SQL.
Mon patron a écrit un article sur ce chemin en 2003: Concaténation avec COALESCE
DECLARE @Str varchar(500)
SELECT @Str=COALESCE(@Str,'') + CAST(ID as varchar(10)) + ','
FROM dbo.fcUser
SELECT @Str
Vous pouvez soit parcourir les lignes avec un curseur et les ajouter à un champ dans une table temporaire, soit utiliser la fonction COALESCE pour concaténer les champs.
Désolé, vous avez mal lu la question la première fois. Vous pouvez faire quelque chose comme ça:
declare @result varchar(max)
--must "initialize" result for this to work
select @result = ''
select @result = @result + alias
FROM aliases
WHERE username='Bob'