逗号分隔值的聚合就位

时间:2017-08-02 14:14:56

标签: sql sql-server tsql 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’)

我需要根据贷款号和现场汇总(汇总)对柜台价值进行分组。 我需要输出如下。

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

2 个答案:

答案 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生成

enter image description here