declare @tb table (id int, cname nvarchar(20), ctype nvarchar(20), total int)
insert into @tb
select 1, 'a', 'aa', 0
union all select 1 ,'a1', 'aa', 2
union all select 1 ,'a2', 'aa', 0
union all select 1 ,'b', 'bb', 0
union all select 1 ,'b1', 'bb', 1
union all select 1 ,'b2', 'bb', 2
union all select 2 ,'a', 'aa', 0
union all select 2 ,'a1', 'aa', 6
union all select 2 ,'a2', 'aa', 4
union all select 2 ,'b', 'bb', 0
union all select 2 ,'b1', 'bb', 5
union all select 2 ,'b2', 'bb', 4
union all select 3 ,'a', 'aa', 0
union all select 3 ,'a1', 'aa', 3
union all select 3 ,'a2', 'aa', 0
union all select 3 ,'b', 'bb', 0
union all select 3 ,'b1', 'bb', 2
union all select 3 ,'b2', 'bb', 4
select a.id,a.cname,case when (b.total is null or b.total =0 ) then a.total else b.total end as total from @tb a
left join ( select id, left(cname,1) as cname, sum(total) as total from @tb group by id, left(cname,1)) b on a.id = b.id and a.cname = b.cname
/*
id cname total
----------- -------------------- -----------
1 a 2
1 a1 2
1 a2 0
1 b 3
1 b1 1
1 b2 2
2 a 10
2 a1 6
2 a2 4
2 b 9
2 b1 5
2 b2 4
3 a 3
3 a1 3
3 a2 0
3 b 6
3 b1 2
3 b2 4
(18 row(s) affected)
*/