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.
fila 1: Ratón
fila 2: Teclado
fila 3: Cable USB-C
↓ agregar texto
Ratón · Teclado · Cable USB-CNo 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.
| Problema | Patrón |
|---|---|
| Unir nombre y ciudad de una fila | CONCAT(nombre, ' - ', ciudad) |
| Listar todos los productos de una categoría | STRING_AGG / GROUP_CONCAT |
La sintaxis depende del motor
| Motor | Ejemplo con orden |
|---|---|
| PostgreSQL | string_agg(nombre, ' · ' ORDER BY nombre) |
| SQL Server | STRING_AGG(nombre, ' · ') WITHIN GROUP (ORDER BY nombre) |
| MySQL | GROUP_CONCAT(nombre ORDER BY nombre SEPARATOR ' · ') |
| SQLite | group_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.
SELECT categoria,
group_concat(nombre, ' · ') AS productos
FROM (
SELECT categoria, nombre
FROM productos
ORDER BY categoria, nombre
)
GROUP BY categoria
ORDER BY categoria;| categoria | productos |
|---|---|
| Accesorios | Cable USB-C · Ratón · Teclado |
| Almacenamiento | Disco SSD |
| Audio | Altavoz · Auriculares |
| Ordenadores | Portátil Pro |
| Pantallas | Monitor 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
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.
estado, id ordenados.estado.group_concat(id, ', ').Solución razonada
SELECT estado,
group_concat(id, ', ') AS pedidos
FROM (
SELECT estado, id
FROM pedidos
ORDER BY estado, id
)
GROUP BY estado
ORDER BY estado;| estado | pedidos |
|---|---|
| cancelado | 103, 108, 116 |
| enviado | 101, 104, 106, 107, 110, 112, 113, 115, 117 |
| pendiente | 102, 105, 109, 111, 114, 118 |
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.
CONCATresuelve otro problema: combina expresiones dentro de una fila.- Define el orden cuando el orden del texto sea significativo.
- Los valores
NULLsuelen omitirse; decide si necesitas un marcador explícito. - El nombre y la sintaxis cambian por motor.