Comment "imploser" (dé-normaliser / concat) plusieurs colonnes dans une seule colonne?

J'ai une requête qui produit quelque chose comme ceci:

+-------+----+--------------+ | F_KEY | EV | OTHER_COLUMN | +-------+----+--------------+ | 100 | 1 | ... | | 100 | 2 | ... | | 150 | 2 | ... | | 100 | 3 | ... | | 150 | 4 | ... | +-------+----+--------------+ 

Je suis sûr que j'ai vu une fonction d'agrégation qui le transforme (en utilisant GROUP BY F_KEY ) en quelque chose comme ceci:

 +-------+------------+--------------+ | F_KEY | ? | OTHER_COLUMN | +-------+------------+--------------+ | 100 | (1, 2, 3) | ... | | 150 | (2, 4) | ... | +-------+------------+--------------+ 

Moyens, il "implose" en quelque sorte les valeurs de EV set dans un seul domaine. Comment puis-je faire ceci? Malheureusement, je ne me souviens pas du nom de la fonction.

J'utilise SQL Server.

C'est une simplification de ma requête:

 SELECT F_KEY, EV, OTHER_COLUMN FROM TABLE1 JOIN TABLE2 ON F_KEY = TABLE2.ID WHERE EVENT_TIME BETWEEN '2011-01-01 00:00:00.000' AND '2011-12-31 23:59:59.999' ORDER BY EVENT_TIME ASC 

Toute idée est appréciée!

    Voici la meilleure méthode de concaténation, elle ne développera pas les caractères spéciaux comme les autres methods XML:

     --Concatenation with FOR XML & eliminating control/encoded char expansion "& < >" set nocount on; declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5)) insert into @YourTable VALUES (1,1,'CCC') insert into @YourTable VALUES (2,2,'B<&>B') insert into @YourTable VALUES (3,2,'AAA') insert into @YourTable VALUES (4,3,'<br>') insert into @YourTable VALUES (5,3,'A & Z') set nocount off SELECT t1.HeaderValue ,STUFF( (SELECT ', ' + t2.ChildValue FROM @YourTable t2 WHERE t1.HeaderValue=t2.HeaderValue ORDER BY t2.ChildValue FOR XML PATH(''), TYPE ).value('.','varchar(max)') ,1,2, '' ) AS ChildValues FROM @YourTable t1 GROUP BY t1.HeaderValue 

    SORTIE:

     HeaderValue ChildValues ----------- --------------- 1 CCC 2 AAA, B<&>B 3 <br>, A & Z (3 row(s) affected) 

    Vous pouvez probablement utiliser la technique décrite ici . (Divulgation complète: c'est mon blog.) Il parle de générer des strings concaténées en T-SQL, sans utiliser de sliders.

    Vous pouvez le faire assez facilement avec une fonction: Suppose que vous allez chercher la même colonne / table tout le time. SQL dynamic nécessaire si vous voulez pouvoir faire varier les colonnes / tables

     CREATE FUNCTION [dbo].[fn_recursion] (@F_KEY int) RETURNS varchar(2000) AS BEGIN DECLARE @ReturnVal Varchar(2000) SELECT @ReturnVal = COALESCE(@ReturnVal + ', ', '') + EV FROM TABLE2 WHERE @F_KEY = @F_KEY RETURN ISNULL(@ReturnVal,'') END GO SELECT F_KEY, EV = [dbo].[fn_recursion](F_KEY), OTHER_COLUMN FROM TABLE1 JOIN TABLE2 ON F_KEY = TABLE2.ID WHERE EVENT_TIME BETWEEN '2011-01-01 00:00:00.000' AND '2011-12-31 23:59:59.999' ORDER BY EVENT_TIME ASC GO DROP FUNCTION [dbo].[fn_recursion] GO 

    Regardez dans l'utilisation de FOR XML PATH, vous pouvez le convertir en utilisant la string xml comme un varchar, cela supporte aussi un caractère / expression séparateur. Il ira à la fin de votre requête, mais vous devrez probablement utiliser une structure de sous-requête.