Cómo Unir Eficazmente Múltiples Filas en SQL Server en Un Solo Campo Delimitado

En la gestión de bases de datos, especialmente cuando se trata de bases de datos relacionales como SQL Server, a menudo te encuentras con escenarios en los que necesitas combinar múltiples filas en un solo campo para una mejor legibilidad y un procesamiento más sencillo. Este artículo abordará cómo resolver este problema utilizando funciones de SQL Server, ilustrando el resultado deseado y soluciones efectivas para diferentes versiones de SQL Server.

El Planteamiento del Problema

Imagina que tienes dos tablas: Vehículos y Ubicaciones. Aquí hay un ejemplo rápido de cómo se ven estas tablas:

Tabla de Vehículos

VehicleID Nombre
1 Chuck
2 Larry

Tabla de Ubicaciones

LocationID VehicleID Ciudad
1 1 Nueva York
2 1 Seattle
3 1 Vancouver
4 2 Los Ángeles
5 2 Houston

El objetivo es extraer datos de manera que se muestre el nombre de cada vehículo junto a una lista de sus ubicaciones asociadas. El resultado deseado debería verse algo así:

VehicleID Nombre Ubicaciones
1 Chuck Nueva York, Seattle, Vancouver
2 Larry Los Ángeles, Houston

Si bien podrías lograr esto a través de consultas complejas y codificación, necesitamos una solución que simplifique el proceso.

Solución: Usando Funciones de SQL Server

Método 1: Usando FOR XML PATH

Si estás utilizando SQL Server 2005 o posterior, uno de los métodos más efectivos para lograr esta concatenación es el comando FOR XML PATH. Aquí te mostramos cómo puedes implementarlo:

SELECT [VehicleID],
       [Nombre],
       (STUFF((SELECT ', ' + [Ciudad] AS [text()]
                FROM [Ubicacion]
                WHERE (VehicleID = Vehiculo.VehicleID)
                FOR XML PATH('')), 1, 2, '')) AS Ubicaciones
FROM [Vehiculo]

Explicación:

  • La declaración SELECT interna recupera las ubicaciones para cada VehicleID y las concatena en una sola cadena.
  • FOR XML PATH('') nos permite generar una única cadena XML a partir de las múltiples filas devueltas por la subconsulta.
  • STUFF se utiliza para eliminar la coma y el espacio inicial de la cadena concatenada.

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

Para aquellos que utilizan SQL Server 2017 o más reciente, hay una manera aún más simple de lograr esto utilizando la función STRING_AGG. Así es como se ve:

SELECT [VehicleID],
       [Nombre],
       (SELECT STRING_AGG([Ciudad], ', ')
        FROM [Ubicacion]
        WHERE VehicleID = V.VehicleID) AS Ubicaciones
FROM [Vehiculo] V

Explicación:

  • STRING_AGG acepta dos argumentos: la columna que deseas agregar y el delimitador con el que deseas separar las entradas. Es mucho más claro y eficiente que el método anterior.

Conclusión

Combinar múltiples filas en un solo campo delimitado en SQL Server puede mejorar significativamente la legibilidad y accesibilidad de tus datos. Ya sea que estés en una versión más antigua y utilices FOR XML PATH o que puedas usar STRING_AGG en versiones más recientes, SQL Server te proporciona las herramientas necesarias para gestionar tus datos de manera eficiente.

Al comprender estas técnicas, puedes simplificar tus consultas SQL, haciéndolas más fáciles de leer, mantener y modificar en el futuro. Siempre elige el método que mejor se adapte a tu versión de SQL Server y a tus requisitos específicos.

Si tienes alguna pregunta o necesitas más aclaraciones sobre estos métodos, ¡no dudes en preguntar en los comentarios a continuación!