Agregación · texto entre filas

STRING_AGG y GROUP_CONCAT: concatenar filas en SQL

Convierte varios valores de un grupo en una sola cadena y controla explícitamente separador, orden y diferencias entre motores.

Lectura: 7–9 minEjemplo comprobadoComparativa por motor
Contenido de esta guía

Respuesta rápida

La agregación de cadenas concatena valores que vienen de varias filas y produce una cadena por grupo. El nombre y la sintaxis cambian entre motores: PostgreSQL y SQL Server usan STRING_AGG; MySQL usa GROUP_CONCAT; SQLite documenta group_concat y también string_agg en versiones actuales.

Idea
fila 1: Ratón
fila 2: Teclado
fila 3: Cable USB-C
        ↓ agregar texto
Ratón · Teclado · Cable USB-C

No es lo mismo que CONCAT

CONCAT combina expresiones de una misma fila. Una función como STRING_AGG o GROUP_CONCAT recibe valores de varias filas y los resume en una sola cadena.

Dos direcciones distintas de concatenación
ProblemaPatrón
Unir nombre y ciudad de una filaCONCAT(nombre, ' - ', ciudad)
Listar todos los productos de una categoríaSTRING_AGG / GROUP_CONCAT

La sintaxis depende del motor

Formas habituales de concatenar valores de un grupo
MotorEjemplo con orden
PostgreSQLstring_agg(nombre, ' · ' ORDER BY nombre)
SQL ServerSTRING_AGG(nombre, ' · ') WITHIN GROUP (ORDER BY nombre)
MySQLGROUP_CONCAT(nombre ORDER BY nombre SEPARATOR ' · ')
SQLitegroup_concat(nombre, ' · '); el orden debe especificarse cuando importe

No memorices una única forma como SQL universal. La intención es común, pero el nombre de la función, la posición de ORDER BY y opciones como el separador varían.

Ejemplo comprobado en SQLite

Queremos una fila por categoría y una lista legible de productos. Para que el ejemplo sea reproducible en SQLite 3.46.1, ordenamos primero el conjunto de entrada y después aplicamos group_concat.

SQL comprobado
SELECT categoria,
       group_concat(nombre, ' · ') AS productos
FROM (
  SELECT categoria, nombre
  FROM productos
  ORDER BY categoria, nombre
)
GROUP BY categoria
ORDER BY categoria;
Resultado comprobado con la base educativa
categoriaproductos
AccesoriosCable USB-C · Ratón · Teclado
AlmacenamientoDisco SSD
AudioAltavoz · Auriculares
OrdenadoresPortátil Pro
PantallasMonitor 24 · Monitor 27

El orden forma parte del resultado

Para una suma, cambiar el orden de entrada no cambia el total. Para una cadena agregada sí puede cambiar el texto final. PostgreSQL y SQLite documentan que el orden de entrada importa en agregados de este tipo; SQL Server y MySQL ofrecen su propia sintaxis para ordenarlo.

Confiar en el orden físico de las filas

Sin una regla de orden, no prometas que la lista saldrá alfabética o en orden de ID. Define el orden usando la sintaxis que documenta tu motor.

Qué ocurre con NULL

Las implementaciones documentadas de STRING_AGG/GROUP_CONCAT omiten normalmente entradas nulas. Eso es distinto de insertar literalmente el texto «NULL». Si necesitas un marcador, transforma el valor de forma explícita con una función como COALESCE o la alternativa de tu motor.

Errores frecuentes

Confundir agrupar texto con concatenar columnas

CONCAT(nombre, email) opera dentro de una fila. STRING_AGG(nombre, ', ') resume muchas filas. Pregúntate primero en qué dirección quieres combinar datos.

Olvidar que la salida puede crecer mucho

Una cadena agregada puede ser enorme cuando el grupo contiene muchas filas. MySQL, por ejemplo, documenta un límite configurable mediante group_concat_max_len. No uses esta técnica como sustituto automático de devolver filas cuando el consumidor necesita datos estructurados.

Copiar la sintaxis de otro motor

El concepto es común, pero ORDER BY y el separador no se escriben igual. Verifica la documentación de PostgreSQL, SQL Server, MySQL o SQLite según tu destino.

Práctica guiada

Intermedia · agrupación + texto

Lista los IDs de pedidos por estado

Devuelve una fila por estado y concatena los IDs de sus pedidos separados por coma. Ordena los IDs de menor a mayor antes de agrupar.

Compatibilidad y elección

PostgreSQL y SQL Server llaman STRING_AGG a la función principal. MySQL documenta GROUP_CONCAT. SQLite documenta group_concat y, en su documentación actual, string_agg como alias compatible con PostgreSQL y SQL Server. Aun así, las opciones de orden y separador no son idénticas.

Qué debes recordar

  • La agregación de cadenas combina valores de varias filas.
  • CONCAT resuelve otro problema: combina expresiones dentro de una fila.
  • Define el orden cuando el orden del texto sea significativo.
  • Los valores NULL suelen omitirse; decide si necesitas un marcador explícito.
  • El nombre y la sintaxis cambian por motor.

Conceptos relacionados

Fuentes técnicas consultadas