Como Juntar Eficientemente Múltiplas Linhas no SQL Server em um Único Campo Delimitado

Na gestão de banco de dados, especialmente ao lidar com bancos de dados relacionais como o SQL Server, você frequentemente encontra cenários onde precisa combinar múltiplas linhas em um único campo para melhor legibilidade e um processamento mais simples. Este post abordará como resolver esse problema usando funções do SQL Server, ilustrando o resultado desejado e soluções eficazes para diferentes versões do SQL Server.

A Declaração do Problema

Imagine que você tem duas tabelas: Veículos e Locais. Aqui está um exemplo rápido de como essas tabelas se parecem:

Tabela de Veículos

VehicleID Nome
1 Chuck
2 Larry

Tabela de Locais

LocationID VehicleID Cidade
1 1 Nova Iorque
2 1 Seattle
3 1 Vancouver
4 2 Los Angeles
5 2 Houston

O objetivo é extrair dados de forma que mostre o nome de cada veículo juntamente com uma lista de seus locais associados. O resultado desejado deve parecer com isto:

VehicleID Nome Locais
1 Chuck Nova Iorque, Seattle, Vancouver
2 Larry Los Angeles, Houston

Embora você possa alcançar isso através de consultas complexas e codificação, precisamos de uma solução que simplifique o processo.

Solução: Usando Funções do SQL Server

Método 1: Usando FOR XML PATH

Se você está usando SQL Server 2005 ou posterior, um dos métodos mais eficazes para alcançar essa concatenação é o comando FOR XML PATH. Aqui está como implementá-lo:

SELECT [VehicleID],
       [Nome],
       (STUFF((SELECT ', ' + [Cidade] AS [text()]
                FROM [Locais]
                WHERE (VehicleID = Veículo.VehicleID)
                FOR XML PATH('')), 1, 2, '')) AS Locais
FROM [Veículo]

Explicação:

  • A instrução SELECT interna recupera os locais para cada VehicleID e os concatena em uma única string.
  • FOR XML PATH('') nos permite gerar uma única string XML a partir das múltiplas linhas retornadas pela subconsulta.
  • STUFF é usado para remover a vírgula e o espaço iniciais da string concatenada.

Método 2: Usando STRING_AGG (SQL Server 2017 e Posterior)

Para aqueles que estão usando SQL Server 2017 ou mais recente, existe uma maneira ainda mais simples de alcançar isso usando a função STRING_AGG. Aqui está como fica:

SELECT [VehicleID],
       [Nome],
       (SELECT STRING_AGG([Cidade], ', ')
        FROM [Locais]
        WHERE VehicleID = V.VehicleID) AS Locais
FROM [Veículo] V

Explicação:

  • STRING_AGG aceita dois argumentos: a coluna que você deseja agregar e o delimitador com o qual deseja separar as entradas. É muito mais claro e eficiente do que o método anterior.

Conclusão

Combinar múltiplas linhas em um único campo delimitado no SQL Server pode aumentar significativamente a legibilidade e acessibilidade dos seus dados. Seja você uma versão mais antiga utilizando FOR XML PATH ou consiga usar STRING_AGG em versões mais novas, o SQL Server fornece as ferramentas necessárias para gerenciar seus dados de forma eficiente.

Ao entender essas técnicas, você pode simplificar suas consultas SQL, tornando-as mais fáceis de ler, manter e modificar no futuro. Sempre escolha o método que melhor se adapta à sua versão do SQL Server e às suas necessidades específicas.

Se você tiver alguma dúvida ou precisar de mais esclarecimentos sobre esses métodos, sinta-se à vontade para perguntar nos comentários abaixo!