agrégation de valeurs séparées par des virgules en position

J'ai une table où il y a deux colonnes loan no et counter_value.

Contre chaque prêt, il n'y a pas la list des valeurs séparées par des virgules sont stockées.

declare @tbl table (loanno varchar(100) , counter_value varchar(200) ) insert into @tbl values('pr0021','1000,200,300,100,800,230'), ('pr0021','500,300,300,100,600,200'), ('pr0021','500,100,200,190,400,100') 

J'ai besoin de faire un regroupement en fonction du prêt non et de l'agrégation en position (sommation) sur les valeurs du countur. J'ai besoin de la sortie comme ci-dessous.

 loanno counter_value pr0021 2000,600,800,390,1800,530 

Puisque vous avez dénormalisé datatables, vous devez d'abord les split en colonnes, effectuer l'agrégation, puis recréer la colonne délimitée. Il y a beaucoup de splitters là-bas mais voici mon préféré pour ce genre de chose. http://www.sqlservercentral.com/articles/Tally+Table/72993/ Le principal avantage de ce séparateur est qu'il renvoie la position de chaque valeur que la plupart des autres séparateurs ne font pas.

En utilisant ce séparateur, vous pouvez le faire comme ça.

 with AggregateData as ( select t.loanno , s.ItemNumber , TotalValue = sum(convert(int, s.Item)) from @tbl t cross apply dbo.DelimitedSplit8K(t.counter_value, ',') s group by t.loanno , s.ItemNumber ) select ad.loanno , STUFF((select ',' + convert(varchar(10), ad2.TotalValue) from AggregateData ad2 where ad2.loanno = ad.loanno order by ad2.ItemNumber FOR XML PATH('')), 1, 1, '') from AggregateData ad group by ad.loanno 

Sean serait mon premier choix (+1).

Cependant, si vous avez un nombre connu (ou fixe) de positions, tenez count des éléments suivants:

Exemple

 Select A.loanno ,NewAggr = concat(sum(Pos1),',',sum(Pos2),',',sum(Pos3),',',sum(Pos4),',',sum(Pos5),',',sum(Pos6)) From @tbl A Cross Apply ( Select Pos1 = n.value('/x[1]','int') ,Pos2 = n.value('/x[2]','int') ,Pos3 = n.value('/x[3]','int') ,Pos4 = n.value('/x[4]','int') ,Pos5 = n.value('/x[5]','int') ,Pos6 = n.value('/x[6]','int') From (Select cast('<x>' + replace(A.counter_value,',','</x><x>')+'</x>' as xml) as n) X ) B Group By A.loanno 

Résultats

 loanno NewAggr pr0021 2000,600,800,390,1800,530 

Si cela aide avec la visualisation, le CROSS APPLY génère

entrez la description de l'image ici