Deve existir jeitos mais inteligentes, mas de bate pronto foi o que me veio a mente. Funciona basicamente usando uma CTE recursiva para ir concatenando o caminho baseado na hierarquia, para no fim, conseguir dar um order by.
declare @exemplo table (agrupamento varchar(100), servico varchar(100), tipo_servico varchar(100), nivel smallint)
insert into @exemplo values
('Ouvidoria', 'Ouvidoria', 'Consolidador', 0),
('Ouvidoria', 'Central de Apoio', 'Consolidador', 1),
('Central de Apoio', 'Acessoria', 'Atendimento', 2),
('Central de Apoio', 'Soluções', 'Atendimento', 2),
('Central de Apoio', 'Soluções 3', 'Consolidador', 2),
('Central de Apoio', 'SAC', 'Atendimento', 2),
('Soluções 3', 'Monitoramento', 'Atendimento', 3),
('Soluções 3', 'SBPrev', 'Consolidador', 3),
('SBPrev', 'Listas', 'Atendimento', 4)
;WITH cte (identificador, agrupamento, servico, tipo_servico, nivel)
AS
(
select
grupo_servico.servico as identificador,
grupo_servico.*
from
@exemplo grupo_servico
where
grupo_servico.nivel = 0
UNION ALL
select
CAST(CONCAT(cte.identificador, grupo_servico.servico) as varchar(100)) as identificador
, grupo_servico.*
from
@exemplo grupo_servico
inner join cte on grupo_servico.nivel = cte.nivel + 1 and grupo_servico.agrupamento = cte.servico
)
SELECT
agrupamento,
servico,
tipo_servico,
nivel
FROM
cte
order by
cte.nivel, cte.identificador