2017-02-07 4 views
0

J'utilise SQL Server 2005 et je voudrais trouver un moyen plus simple de concaténer plusieurs lignes en 1 chaîne.Concatage des lignes en 1 chaîne

PK Column1, Column2 
-- ------- ------- 
PK1 apple orange 
PK1 pear  banana 
PK1 honey 
PK2 apple2 orange2 
PK2 pear2  banana2 
PK2 honey2 

Résultats:

PK1, apple orange pear banana honey 
PK2, apple2 orange2 pear2 banana2 honey2 

Il est très facile à utiliser COALESCE mais il n'est pas disponible dans SQL Server 2005. J'ai essayé XML Path mais il ajoute caractère supplémentaire à la fin.

Pourriez-vous s'il vous plaît me fournir une suggestion? Merci.

Répondre

0

Ce piégera valeurs nulles ou vides

Declare @YourTable table (PK int,Column1 varchar(25), Column2 varchar(25)) 
Insert Into @YourTable values 
(1,'apple','orange'), 
(1,'pear','banana'), 
(1,'honey', null), 
(2,'apple2','orange2'), 
(2,'pear2','banana2'), 
(2,'honey2', null) 

Select PK 
     ,DelimString = Stuff((Select case when Column1 is null or Column1='' then '' else ' ' + replace(Column1,char(13),'') end 
            +case when Column2 is null or Column2='' then '' else ' ' + replace(Column2,char(13),'') end 
          From @YourTable 
          Where PK=A.PK 
          For XML Path('')), 1, 1, '') 
From @YourTable A 
Group By PK 

Retours

PK DelimString 
1 apple orange pear banana honey 
2 apple2 orange2 pear2 banana2 honey2 
+0

Merci John. Pour une raison quelconque, en utilisant XML Path, il a ajouté & # x0D à la fin de la chaîne. Je verrai comment je peux l'enlever. – user3015739

+0

@ user3015739 C'est un saut de ligne –

+0

J'essaie de savoir où mettre la commande TEXT par ce qui est décrit ici: http://stackoverflow.com/questions/16547175/sql-stuff-and-for-xml-path- generating-strange-symbols – user3015739

0

Une solution beaucoup plus facile est d'utiliser XML PATH

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(a.Column1) 
FROM dbo.mytbl AS a WHERE a.ColumnX = somecondition 
FOR XML PATH ('') , TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SELECT @cols 

Bien sûr, la clause WHERE est facultative dans votre Cas. Et sans cuillère vous nourrir, appliquer la même chose à votre autre colonne et les concaténer. Voila!

0

Lorsque vos données sont des espaces vides ' ' en raison de for xml path vous verrez un   à la fin comme '  ':

select ' ' for xml path (''); 

Dans votre cas, je peux utiliser cette requête:

select t.PK, 
    ltrim(rtrim(replace(
    (select ' ' + isnull(ti.Column1, '') + ' ' + isnull(ti.Column2, '') 
    from yourTable ti 
    where ti.PK = t.PK 
    for xml path ('')) 
    , ' ', ''))) fruits 
from yourTable t 
group by t.PK;