2010-12-12 24 views
2

disons que j'ai une table avec des colonnes comme ceci:TSQL Comment construire une chaîne dynamiquement?

| Name | Cat_id | 

Je ne me souviens pas la fonction qui peut construire un varchar comme celui-ci

1,24|4,56|5,67 

où le nombre avant la virgule est le Cat_id, et le nombre après la virgule est le nombre de lignes avec cet ID. Des idées ?

+1

il est le SQL Server – Tony

+1

en double de : http://stackoverflow.com/questions/941103/concat-groups-in-sql-server – thomaspaulb

+0

Le symbole du tube fait-il partie de la sortie? Est-ce que la sortie est juste une ligne avec les valeurs délimitées par pipe de cat_id, count (cat_id) ou vous attendez une ligne par cat_id? –

Répondre

3

Cela pourrait faire l'affaire:

declare @s varchar(8000) 
set  @s = '' 

select @s = @s + cast(cat_id as varchar(20)) + ',' + cast(count(*) as varchar(20)) + '|' 
from SomeTable 
group by cat_id 
option(maxdop 1) -- this sure there are no funny side-effects because of parallelism 

print @s 

Sinon, vous pouvez utiliser « pour xml », ou un curseur, mais cela devrait être plus rapide.

Cordialement GJ

+0

hm, le compte (*) renvoie toujours 1, même si je crée une sous-requête (sélectionnez count (*) de SomeTable où cat_id = st.cat_id) au lieu de ce compte (*) – Tony

+0

Devrait fonctionner ... sûr que vous ne faites pas hae ID unique? (pas improbable ...) – gjvdkamp

+0

Merde, désolé, je l'ai mal lu. Faites-le @S = @s + nom + ',' .. etc .. groupe par nom. Nous sommes en train de regrouper Cat_id au lieu du nom. EDIT: Non, vous avez demandé un groupe par cat_id. T'es sûr de ça? – gjvdkamp

0

Espérons que cela aidera (sql server 2005 +) ... Je ne l'ai pas testé le programme que je donot SQL Server est actuellement

With Cte1 As(
Select Cat_ID, Count(Cat_ID),Cast(Cat_ID as Varchar) + Cast(Count(Cat_ID)) as MergedColumn from tbl 
group by Cat_ID), 
cte2 as(
Select 
    Cat_ID 
    , mergedData = stuff((Select cast(MergedColumn + '|' as varchar) from tbl t2 where t2.Cat_ID = t1.Cat_ID 
        for xml path('')),1,1,'') 
from tbl t1) 

select mergedData from Cte2