怎么把这样的数据按a,b,c列的顺序合并重复数据,并下一列以上一列为条件,生成合并后的新数据

如何把这样的数据按a,b,c列的顺序合并重复数据,并下一列以上一列为条件,生成合并后的新数据

ID   A    B    C
1 111 a a1
2 111 a a2
3 111 bbb b1
4 111 bbb b2
5 111 bbb b2
6 11111 cc cc
7 11111 cc cc
8 222 22 2
9 222 22 21
10 333 1 1


如何把这样的数据按a,b,c列的顺序合并重复数据,并下一列以上一列为条件,生成合并后的新数据,如?:

A         B          C
111    a           a1
                        a2
          bbb b1
                        b2
11111   cc    cc
222       22    2
                       21
333         1 1



------解决方案--------------------

--sql2012
ID   A    B    C
1    111    a    a1
2    111    a    a2
3    111    bbb    b1
4    111    bbb    b2
5    111    bbb    b2
6    11111    cc    cc
7    11111    cc    cc
8    222    22    2
9    222    22    21
10    333    1    1

--创建表#a
create table #a
(
 id  int identity not null,
  a  smallint,
  b  varchar(20),
  c varchar(20)
)

--插入数据
insert into #a (a,b,c)
         values(111,'a','a1'),
(111,'a','a2'),
(111,'bbb','b1'),
(111,'bbb','b2'),
(111,'bbb','b2'),
(11111,'cc','cc'),
(11111,'cc','cc'),
(222,'22','2'),
(222,'22','21'),
(333,'1','1')
select * from #a
--结果展示
/*
id          a      b                    c
----------- ------ -------------------- --------------------
1           111    a                    a1
2           111    a                    a2
3           111    bbb                  b1
4           111    bbb                  b2
5           111    bbb                  b2
6           11111  cc                   cc
7           11111  cc                   cc
8           222    22                   2
9           222    22                   21
10          333    1                    1

(10 行受影响)
*/

--解决方案

;with a as(

select a,b,c,row_number() over(partition by a,b order by c)as rn
from (select distinct a,b,c from #a) as a
)
select replace(case when rn =1 then a when rn >1 then ' ' else '' end ,0,'') ) as a,
       replace(case when rn =1 then b when rn >1 then ' ' else '' end  ,0,'')) as b,