Вот, пожалуйста:
;with A as(
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's1' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's2' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's3' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's4' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's4' as store
)
select * from
(select distinct field1,field2,field3 from A) Af
cross apply(select
STUFF( (
select distinct '_' + A.store
from ( select * from A) A
where Af.field1=A.field1 and Af.field2=A.field2 and Af.field3=A.field3
FOR XML PATH(''), TYPE
).value('.','nvarchar(max)')
,1,1, '') as conc_store
) as q1
Af - все возможные значения полей, а A объединяет значения хранилища.
Обратите внимание, что вам не понадобится with A as....
часть, если A действительно существует в виде таблицы.