我有一张表,其中有两列借贷编号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

10-07 12:34