hie*_*eko 3 sql t-sql sql-server sql-server-2012
我有一个表有两列贷款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’)
Run Code Online (Sandbox Code Playgroud)
我需要根据贷款号和现场汇总(总和)对柜台价值进行分组.我需要输出如下.
loanno counter_value
pr0021 2000,600,800,390,1800,530
Run Code Online (Sandbox Code Playgroud)
由于您具有非规范化数据,因此首先必须将其拆分为列,执行聚合,然后重新创建分隔列.那里有很多分离器,但这是我最喜欢的这类东西.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
Run Code Online (Sandbox Code Playgroud)