我有一张表,其中有两列借贷编号no和counter_value。
对于每笔贷款,都没有存储逗号分隔值的列表。
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’)
我需要根据贷款编号和计数器值就位汇总(汇总)进行分组。
我需要如下输出。
loanno counter_value
pr0021 2000,600,800,390,1800,530
最佳答案
由于已对数据进行了非规范化,因此您首先必须将其拆分为列,进行汇总,然后重新创建带分隔符的列。那里有很多分离器,但这是我最喜欢的一种东西。 http://www.sqlservercentral.com/articles/Tally+Table/72993/该拆分器的主要优点是它返回每个值的位置,而大多数其他拆分器都不会。
利用该拆分器,您可以像这样进行操作。
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