
Append, Merge, Reference, parámetros y funciones reutilizables
2 horas · 2 bloques de 45 min · nivel intermedio–avanzado
Combinar y reestructurar consultas
Lenguaje M, parámetros y funciones
let … inTrabajamos sobre el mismo Excel: SunFruits_Ventas_Practica.xlsx.
Al terminar la sesión vas a poder…
Apilar (Append) y cruzar (Merge) consultas eligiendo el join correcto.
Convertir una limpieza en una función M e invocarla sobre muchas hojas.
Usar parámetros para rutas y valores, y entender el orden de pasos / folding.
Si te encuentras repitiendo los mismos pasos en varias hojas, no copies y pegues: crea una función. Una sola fuente de verdad para tu limpieza.
Ventas_2024Limpiaste una hoja. Pero hay 4: Ventas_2023, Ventas_2024, Ventas_2025 y Ventas_2026… y todas necesitan lo mismo.
¿Repetimos 10 pasos × 4? No. Hoy lo resolvemos bien.
Reference, Append, Merge y Unpivot
Tenemos las ventas separadas por año. El modelo necesita UNA tabla de hechos.
Las 4 hojas tienen el mismo formato → esto es un Append.
Sumar tipo de cambio, región del cliente → esto es un Merge.
Antes de combinar, conviene separar la limpieza base de sus derivados.
Copia la consulta con TODOS sus pasos. Independiente: si cambias el original, la copia NO cambia.
Crea una consulta nueva que parte del resultado de otra. Si cambias la original, la referencia se actualiza.
Usa Reference para construir capas (staging → hechos / agregados).
El Append une tablas una debajo de otra, combinando los encabezados por nombre (no por posición).
null.Por eso es clave que las 4 hojas tengan los mismos nombres de columna.
Agrega otras tablas a la consulta actual (la modifica).
Crea una consulta nueva con el resultado; las originales no se tocan. Recomendado
Inicio → Combinar → Anexar consultas. Para 4 hojas usa el modo "Tres o más tablas".
Elige "Tres o más tablas", agrega las 4 consultas de ventas y Aceptar.
// Anexar las 4 hojas ya limpias
= Table.Combine({
Ventas_2023, Ventas_2024,
Ventas_2025, Ventas_2026
})
Resultado: ~4.000 filas en una sola consulta Ventas.
El Merge cruza dos tablas por una o más columnas clave. El tipo de join define qué filas conservas.
| Join | Qué conserva | Uso típico en SunFruits |
|---|---|---|
| Left Outer | Todo de la izquierda + coincidencias | Ventas + datos de Cliente (sin perder ventas) |
| Inner | Solo lo que coincide en ambas | Solo ventas con tipo de cambio cargado |
| Full Outer | Todo de ambas | Auditar qué no cruza |
| Left Anti | Izquierda SIN coincidencia | Clientes en ventas que faltan en el maestro |
| Right Anti | Derecha SIN coincidencia | Clientes del maestro que nunca compraron |
💡 Los anti joins son oro para detectar datos huérfanos antes de modelar.
Inicio → Combinar → Combinar consultas. Elige la tabla derecha, la columna clave en ambas y el join.
// Ventas + maestro de Clientes (Left Outer)
= Table.NestedJoin(Ventas,
{"Cliente"}, Clientes, {"Cliente"},
"datosCliente", JoinKind.LeftOuter)
Resultado: una columna anidada lista para expandir.
Tras el Merge, expande solo las columnas que necesitas (sin prefijo) para evitar nombres tipo Tabla.Columna.
Periodo en Ventas (aaaa-mm) desde Fecha Pedido.tblTipoCambio por Periodo.USD_PEN y calcula Monto en soles.// Clave de periodo aaaa-mm
= Date.ToText([Fecha Pedido], "yyyy-MM")
// Merge por Periodo y expandir el TC
= Table.ExpandTableColumn(Cruce,
"tc", {"USD_PEN"})
// Monto en soles
= [Monto USD (calc)] * [USD_PEN]
Une tablas verticalmente (más filas). Mismas columnas.
"Tengo ventas 2023, 2024… las junto en una."
Une tablas horizontalmente (más columnas) por una clave.
"A cada venta le pego la región del cliente / el tipo de cambio."
Regla mnemotécnica: Append = apila filas · Merge = pega columnas.
La hoja Costos_2025 trae los meses en columnas. Para BI necesitamos formato largo.
Selecciona las columnas fijas y "Anular dinamización de otras columnas".
// Costos: meses (Ene..Dic) -> filas
= Table.UnpivotOtherColumns(
Costos,
{"Centro de Costo", "Fundo"},
"Mes", "Costo (miles USD)")
Resultado: una fila por centro/fundo/mes, listo para relacionar.
Convierte tu limpieza en algo reutilizable
let … in
Cada consulta es un bloque let … in. Cada paso es una variable que alimenta a la siguiente.
let
Origen = Excel.Workbook(...),
Hoja = Origen{[Item="Ventas_2024"]}[Data],
Limpia = Table.Skip(Hoja, 3)
in
Limpia
M es funcional y case-sensitive. El orden de los pasos importa.
Un parámetro guarda un valor reutilizable. El clásico: la ruta del archivo, para no editar cada consulta al moverlo de PC.
Origen.
= Excel.Workbook(File.Contents(pRutaArchivo), null, true)
Cualquier consulta puede convertirse en función. Limpias una hoja "modelo" y Power Query genera la función a partir de esos pasos.
Con una consulta que liste las hojas del libro, invoca la función en cada fila con Invocar función personalizada.
Data de cada hoja.
fnLimpiarVentasUna función que recibe la tabla de una hoja y devuelve la hoja limpia.
(hoja as table) =>
let
Skip = Table.Skip(hoja, 3),
Encab = Table.PromoteHeaders(Skip, [PromoteAllScalars=true]),
Tipos = Table.TransformColumnTypes(Encab,
{{"Fecha Pedido", type date}, {"Precio USD x Kg", type number},
{"Cajas", Int64.Type}, {"Kg Netos", type number}}, "es-PE"),
SinTot = Table.SelectRows(Tipos, each [N Orden] <> null and [N Orden] <> ""),
Dedup = Table.Distinct(SinTot, {"N Orden"})
in
Dedup
Invócala sobre las 4 hojas y haz Append → una sola limpieza, cero copy-paste.
El query folding empuja transformaciones al origen (ej. una BD) para que ejecute él, no Power Query.
Un modelo mantenible empieza por un Power Query ordenado.
fnLimpiarVentas a partir de tu limpieza de la Sesión 1.Ventas.Costos_2025.pRutaArchivo para el origen.tblTipoCambio (Periodo) y con Clientes.let … in: pasos encadenados, el orden importa🎯 Si te llevas una sola idea: limpieza repetida = función. Una fuente de verdad, mantenible y a prueba de "otra hoja más".
Verifiquemos lo aprendido en esta sesión
¿Cuál es la diferencia entre Append y Merge, y cuándo usas cada uno?
Para conservar todas las ventas aunque el cliente no esté en el maestro, ¿qué tipo de join eliges?
¿Qué problema detecta un anti join y por qué es útil antes de modelar?
¿Qué ganas al convertir tu limpieza en una función en vez de repetir los pasos en cada hoja?
¿Para qué sirve el parámetro pRutaArchivo y qué problema evita?
Gracias al equipo de SunFruits por su tiempo y participación
Arquitecto de Inteligencia de Negocios & Cloud · Instructor
🌐 blog.arquitecturabi.pe
Nos vemos en la Sesión 3 — Modelado: esquema estrella