我有一个表,其中有两列贷款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
答案 0 :(得分:5)
由于您具有非规范化数据,因此首先必须将其拆分为列,执行聚合,然后重新创建分隔列。那里有很多分离器,但这是我最喜欢的这类东西。 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
答案 1 :(得分:2)
肖恩将是我的第一选择(+1)。
但是,如果您有已知(或固定)的职位数,请考虑以下事项:
示例强>
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
<强>返回强>
loanno NewAggr
pr0021 2000,600,800,390,1800,530
如果它有助于可视化,则CROSS APPLY生成