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:

[code language=”sql”]
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)
[/code]


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.

[code language=”sql”]
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
[/code]

É isso!