post icon

Concatenar filas en una sola fila con valores separados por comas con SQL

Constantemente me topo con personas del ambiente laboral o de foros que me preguntan como pueden pasar las filas que les retorna un select a una sola columna y fila separando los valores por comas, por eso hoy publico este post.

Para lograr esto existen muchas vías, unas más optimas o complejas que otras. No voy a exponer cada una de esas técnicas, pero si veremos una de las maneras más sencillas y eficientes hacerlo. El ejemplo está basado en TSQL con variables de tipo tabla, pero perfectamente puede aplicarse a cualquier tipo de tabla y a cualquier contexto semejante.

declare @personas table(id int, nombre nvarchar(50))
insert into @personas values(1, N'Maria');
insert into @personas values(1, N'Jose');
insert into @personas values(1, N'Marcos');
insert into @personas values(1, N'Natalia');
insert into @personas values(1, N'Romeo');

declare @nombres nvarchar(4000)
select @nombres = coalesce(@nombres + ', ', '') + p.nombre from @personas as p;

select @nombres;

Otra forma de conseguir el mismo resultado es como sigue:

 select
    stuff((
            select
                ', ' + nombre
            from
                @personas as p2
          for
            xml path('')
          ), 1, 1, '');

Y el resultado es el siguiente

resultset

Comentarios desde Facebook:

  1. avatar
    Sergio Google Chrome Windows
    6 septiembre 2017 at 14:27 #

    Hola. En SQL SERVER es posible obtener como filas individuales resultados que están almacenados en una columna como valores separados por comas?

    Es decir… tengo una columna llamada NOMBRE que tiene valores:
    # Nombre
    1 Sergio,Juan
    2 Roberto,Mario,Sergio
    3 Juan,Ignacio,Sergio,Mario

    Si pudiera obtener los nombres únicos, uno en cada fila de la respuesta sería excelente. O sea que el SELECT me devolviera un conjunto de resultados similar al siguiente:

    # Nombre
    1 Sergio
    2 Juan
    3 Roberto
    4 Mario
    5 Ignacio

    Sino, me conformo con obtener los nombres en filas y después haré una consulta del tipo DISTINCT sobre esos resultados.

    Muchas gracias a la comunidad!

  2. avatar
    May McFly MEXICO Mozilla Firefox Windows
    3 septiembre 2016 at 14:05 #

    SELECT
    area,
    STUFF(
    (SELECT empleado+’, ‘
    FROM tb2
    WHERE area= a.area
    FOR XML PATH (”))
    , 1, 0, ”) AS [Campos Concatenados]
    FROM tb1 AS a
    GROUP BY area

Responder