SQL Server – Agrupando e Desagrupando Valores em Linhas e Células
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.GrupoFROM
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.
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!