web-dev-qa-db-fra.com

Comment renvoyer plusieurs valeurs dans une colonne (T-SQL)?

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 :)

44
roman m

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
55
Scott Nichols

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

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.

3
Mladen

Jetez un oeil à ce fil déjà sur StackOverflow , il vous donne commodément un exemple T-SQL.

3
Mike McAllister

Mon patron a écrit un article sur ce chemin en 2003: Concaténation avec COALESCE

2
Ryan Rinaldi
DECLARE @Str varchar(500)

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

SELECT @Str
1
Tushar Maru

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.

0
Eric Z Beard

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'
0
CodeRedick