Olá pessoal! Resolvi compartilhar dois exemplos de problemas clássicos com os quais sempre me deparo no SQL Server: Agrupar e desagrupar valores que se encontram em células.

Exemplo 1 – Desagrupando Valores
Nesse exemplo vamos pegar um conjunto de dados com o seguinte formato:

Caminho Grupos
\\server01\engenharia DOMAIN\Engenheiros, DOMAIN\Administradores, DOMAIN\Gestores
\\server01\tesouraria DOMAIN\Tesoureiros, DOMAIN\Administradores

E iremos transformá-lo no seguinte:

Caminho Grupo
\\server01\engenharia DOMAIN\Engenheiros
\\server01\engenharia DOMAIN\Administradores
\\server01\engenharia DOMAIN\Gestores
\\server01\tesouraria DOMAIN\Tesoureiros
\\server01\tesouraria DOMAIN\Administradores

Para isso utilizaremos o excelente operador APPLY – que apesar de muito poderoso, vejo pouca utilização – e a função fn_split demonstrada no nosso post anterior da seguinte forma:

SELECT grp.Caminho, sgr.Grupo
FROM
  Grupos grp
  CROSS APPLY
  (
    SELECT RTRIM(LTRIM(Token)) AS Token
    FROM dbo.fn_split(grp.Grupos, ',')
  ) AS sgr(Grupo)


Exemplo 2: Agrupando Valores

Aqui faremos exatamente o oposto da operação anterior, considerando o mesmo conjunto de dados: agruparemos várias linhas em uma única linha e concatenaremos os valores de várias linhas de um determinado campo em uma única célula. Para isso utilizaremos outro operador poderoso do T-SQL e que também vejo pouca utilização: o FOR XML.

SELECT DISTINCT
  grp.Caminho,
  STUFF((
    SELECT ', ' + CONVERT(VARCHAR(100), igr.Grupo) AS [text()]
    FROM [Grupos] igr
    WHERE igr.Caminho = grp.Caminho
    FOR XML PATH('')
  ), 1, 2, '') AS [Grupos]
FROM [Grupos] grp

É isso!