Saltar al contenido
🗺️ Gratis: Mapa de México por municipio en Power BI — plantilla lista para descargar Descargar gratis →

Extraer valores de una lista de registros en Power Query

Ilustración clara de una celda que se despliega en tarjetas de registro y estas en una columna de valores extraídos

TL;DR: Cuando una columna contiene una lista de registros y necesitas un campo de cada uno concatenado en texto, usa List.Transform([Columna], each [campo]) para sacar el valor de cada registro y Text.Combine(..., ", ") para unirlos. Para evitar el error con listas vacías o nulas, envuelve la lista con [Columna] ?? {} antes de transformar.


No hemos podido validar tu suscripción.
Tu PDF va en camino — revisa tu correo

Tu guía de Power Query gratis

Las APIs y los archivos JSON adoran las estructuras anidadas. Al cargarlos en Power Query, es habitual terminar con una columna donde cada celda no es un valor, sino una lista que contiene varios registros, y dentro de cada registro un puñado de campos. Sacar uno de esos campos de todos los registros y combinarlos en una sola cadena parece que debería ser trivial; en la práctica, atasca a tanta gente que el hilo de referencia roza las 85.000 vistas.

El error clásico aparece cuando alguna fila tiene la lista vacía o nula: Expression.Error: We cannot convert the value null to type Record. Vamos a resolver el caso completo, incluyendo ese borde.

¿Qué es una lista de registros en Power Query?

En el Lenguaje M conviven varios tipos estructurados:

  • Un valor es un dato simple ("VIP", 42, una fecha).
  • Un registro (record) es un conjunto de pares campo-valor: [name = "VIP", id = 1].
  • Una lista (list) es una secuencia ordenada: {1, 2, 3}.

Una lista de registros es una lista cuyos elementos son registros: {[name="VIP"], [name="Gold"]}. Es exactamente lo que produce expandir un JSON anidado sin aplanar.

¿Por qué falla extraer solo el primer registro?

El intento natural es indexar el primer elemento y leer su campo:

Record.Field([types]{0}, "name")

Esto funciona… hasta que una fila tiene cero registros o un null. Indexar {0} sobre una lista vacía revienta, y Record.Field sobre null lanza el error de conversión. Además, solo recupera el primero: si hay tres registros, pierdes dos. Necesitamos recorrer todos los registros de la lista y tolerar las vacías.

¿Cuándo aparece este patrón?

  • APIs: un cliente con varias etiquetas, un producto con varias categorías.
  • JSON anidado: pedidos con líneas de detalle, contactos con varios teléfonos.
  • Archivos de configuración: elementos con listas de atributos heterogéneas.

¿Cómo se hace paso a paso?

Paso 1: extraer el campo de cada registro con List.Transform

List.Transform aplica una función a cada elemento de la lista. Aquí, a cada registro le pedimos su campo name:

List.Transform([types], each [name])

El resultado por fila es una lista de textos: {"VIP", "Gold", "Premium"}. Ya no perdemos registros: están todos.

Paso 2: concatenar en una sola cadena

Text.Combine une una lista de textos con el separador que elijas:

Text.Combine(
    List.Transform([types], each [name]),
    ", "
)

Para la fila del ejemplo, devuelve "VIP, Gold, Premium".

Paso 3: blindar contra listas vacías y nulas

Aquí está la pieza que falta en casi todas las respuestas a medias. Si [types] es null, List.Transform falla. El operador de coalescencia ?? sustituye el nulo por una lista vacía, y una lista vacía produce simplemente una cadena vacía sin error:

Text.Combine(
    List.Transform([types] ?? {}, each [name]),
    ", "
)

Con esto, las filas sin registros devuelven "" en lugar de romper toda la consulta.

Paso 4: añadirlo como columna personalizada

El paso completo, listo para pegar en Agregar columna personalizada:

Table.AddColumn(
    Origen,
    "ClientTypes",
    each Text.Combine(
        List.Transform([types] ?? {}, each [name]),
        ", "
    ),
    type text
)

Declarar type text al final evita que Power Query deje la columna como tipo any, lo que mejora el rendimiento y el folding.

Variante: campos que a veces no existen

Si algún registro puede no tener el campo name, usa Record.FieldOrDefault para devolver un valor por defecto en lugar de fallar:

each Text.Combine(
    List.Transform([types] ?? {}, each Record.FieldOrDefault(_, "name", "")),
    ", "
)

El _ representa el registro actual dentro de List.Transform.

Errores comunes

Síntoma Causa Solución
cannot convert null to type Record La fila tiene la lista nula Usar [Columna] ?? {}
Solo aparece el primer valor Se indexó {0} en lugar de recorrer Usar List.Transform sobre toda la lista
Field not found Algún registro no tiene el campo Usar Record.FieldOrDefault
Columna queda como any No se declaró el tipo Añadir type text en Table.AddColumn

Conclusión

Aplanar una lista de registros se reduce a dos funciones — List.Transform para extraer y Text.Combine para unir — más un ?? {} que evita el error más frecuente. Es un patrón que reaparece cada vez que trabajas con JSON o APIs, así que vale la pena tenerlo memorizado.

Si trabajas con datos anidados, listas y registros de forma habitual, este curso de Lenguaje M aplicado lo cubre con casos reales:

Power Query: Lenguaje M aplicado a casos prácticos Office365 ExcelTOP VENTASUdemy
Power Query

Power Query: Lenguaje M aplicado a casos prácticos Office365 Excel

★ 4.8(449 estudiantes)
$19.99

Fuente: hilo del foro oficial de Microsoft Fabric con más de 85.000 vistas, solución verificada por la comunidad.

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *