Workshop 4 - Accounting Architectures - Module 2
1 Introducción
En los Workshops 2 y 3 construiste un modelo semántico correcto, escribiste medidas bien formadas y aprendiste funciones de Time Intelligence para calcular crecimientos anuales. Este workshop cierra el módulo con tres bloques:
Parte I - Análisis de Pareto. El concepto, por qué importa en contabilidad, y la implementación completa en DAX. Aquí está la explicación detallada del contexto de filtro, que es el concepto que separa a quien copia fórmulas de quien las entiende.
Parte II - El puente de Gross Profit. La explicación conceptual y algebraica del CHALLENGE 3 (opcional) del Workshop 3: cómo se descompone exactamente la diferencia de utilidad bruta entre dos periodos, qué significa cada efecto, por qué aparece el efecto mezcla cuando bajas al detalle, y cómo se construye un gráfico de cascada en Power BI.
Parte III - Dos dashboards con un dataset nuevo. A partir de aquí ya no hay instrucciones paso a paso. Se te da un dataset nuevo (Contoso), el contexto de negocio y dos retos con los indicadores que se esperan. Tú decides cómo modelar, qué medidas escribir y qué visuales usar. Esa es exactamente la situación en la que estarás en un trabajo real.
2 PARTE I. El análisis de Pareto
2.1 Por qué esto importa en contabilidad
El principio de Pareto dice que una minoría de las causas produce la mayoría de los efectos. En una empresa eso aparece por todas partes: unos pocos clientes concentran la facturación, unas pocas cuentas concentran el gasto, unos pocos proveedores concentran las cuentas por pagar.
Saber quiénes son esos pocos cambia decisiones reales: a quién visitar primero, qué cuentas auditar, dónde concentrar la gestión de cobranza, qué riesgo de concentración revelar en las notas a los estados financieros. Un análisis de Pareto es la herramienta que los identifica.
La parte difícil no es el concepto, es el cálculo: para saber cuánto lleva acumulado un cliente necesitas mirar a todos los demás clientes al mismo tiempo. Y eso, en Power BI, es exactamente lo que no ocurre por defecto. Toda esta sección trata de resolver ese problema.
2.2 El caso: cartera de clientes 2025
Trabajaremos con ocho clientes. El modelo tiene una tabla de hechos Facturas con la columna Importe, y una tabla de dimensión Clientes con la columna Cliente, relacionadas entre sí.
| Cliente | Ventas |
|---|---|
| Distribuidora Álamo | 400,000 |
| Grupo Bermejo | 250,000 |
| Constructora Cedral | 150,000 |
| Textiles del Norte | 90,000 |
| Aceros Poniente | 50,000 |
| Papelera Quiroga | 30,000 |
| Ferretería Solís | 20,000 |
| Vidrios Tepeyac | 10,000 |
| Total | 1,000,000 |
Esto es lo que queremos obtener al final. Fíjate en las dos últimas columnas: son las que no sabemos calcular todavía.
| # | Cliente | Ventas | Acumulado | % acumulado |
|---|---|---|---|---|
| 1 | Distribuidora Álamo | 400,000 | 400,000 | 40 % |
| 2 | Grupo Bermejo | 250,000 | 650,000 | 65 % |
| 3 | Constructora Cedral | 150,000 | 800,000 | 80 % |
| 4 | Textiles del Norte | 90,000 | 890,000 | 89 % |
| 5 | Aceros Poniente | 50,000 | 940,000 | 94 % |
| 6 | Papelera Quiroga | 30,000 | 970,000 | 97 % |
| 7 | Ferretería Solís | 20,000 | 990,000 | 99 % |
| 8 | Vidrios Tepeyac | 10,000 | 1,000,000 | 100 % |
Idea clave. El resultado real es 37/80, no 20/80. El “80/20” es una observación empírica frecuente, no una ley. Tu trabajo como analista es reportar la proporción que realmente encuentras, no forzar los datos hacia la cifra que esperabas.
2.3 Antes de escribir DAX: el contexto de filtro
Este concepto es el 90 % de la dificultad. Si lo entiendes, el resto de la sección es mecánico.
Cuando pones una medida en una tabla de Power BI, la medida no se calcula una vez: se calcula muchas veces, una por cada celda. Y en cada una de esas ejecuciones, Power BI aplica automáticamente un filtro invisible que corresponde a la fila (y columna) donde está esa celda.
Piensa en un mayor auxiliar. Cuando ves la línea de “Distribuidora Álamo”, estás viendo un extracto filtrado del mayor general: solo los movimientos de ese cliente. Power BI hace lo mismo, automáticamente, en cada celda. A ese filtro invisible se le llama contexto de filtro.
| Dónde está la celda | Filtro invisible que aplica Power BI | [Ventas] devuelve |
|---|---|---|
| Fila “Distribuidora Álamo” | Cliente = "Distribuidora Álamo" |
400,000 |
| Fila “Grupo Bermejo” | Cliente = "Grupo Bermejo" |
250,000 |
| Fila “Vidrios Tepeyac” | Cliente = "Vidrios Tepeyac" |
10,000 |
| Fila de totales | ninguno sobre Cliente | 1,000,000 |
Aquí está el problema. Para calcular el acumulado de “Constructora Cedral” necesito sumar sus ventas más las de Álamo más las de Bermejo. Pero cuando Power BI calcula la celda de Cedral, el contexto de filtro me deja ver únicamente a Cedral. Los otros siete clientes están, literalmente, fuera de mi vista.
Todo lo que sigue son técnicas para recuperar la visión del conjunto desde dentro de una fila individual.
2.4 Paso 1 - La medida base
Empezamos por lo simple. Esta medida suma el importe de las facturas visibles en el contexto actual.
Ventas = SUM( Facturas[Importe] )
Nada más. Todo el resto del análisis se construye reutilizando esta medida, nunca repitiendo el SUM. Eso se llama componer medidas y es la práctica correcta: si mañana “ventas” pasa a ser neto de devoluciones, corriges una sola fórmula y todo el reporte se actualiza.
2.5 Paso 2 - ALLSELECTED: recuperar la vista del conjunto
ALLSELECTED( Clientes[Cliente] ) devuelve una tabla de una sola columna con la lista de clientes, ignorando el filtro que el visual pone en cada fila, pero respetando los filtros que puso el usuario (segmentadores, filtros de página, filtros de otro visual).
En otras palabras: “muéstrame todos los clientes que el usuario decidió mirar, aunque yo esté parado en la fila de uno solo”.
Compara las tres funciones que devuelven listas de valores. Supón que el usuario activó un segmentador de región = Norte, que deja 5 de los 8 clientes, y que estamos calculando la celda de Cedral:
| Función | Qué devuelve aquí | ¿Obedece al segmentador? | ¿Obedece a la fila del visual? |
|---|---|---|---|
VALUES( Clientes[Cliente] ) |
1 cliente (Cedral) | Sí | Sí |
ALLSELECTED( Clientes[Cliente] ) |
5 clientes (los del Norte) | Sí | No |
ALL( Clientes[Cliente] ) |
8 clientes (todos) | No | No |
VALUESno sirve para el acumulado: desde la fila de Cedral solo veo a Cedral, que es justo el problema que quiero resolver.ALLtampoco: ignora el segmentador, así que si el usuario filtra a la región Norte, el acumulado seguiría calculándose sobre los 8 clientes y los porcentajes nunca llegarían al 100 %.ALLSELECTEDes la correcta: quita el filtro del visual, conserva el del usuario.
Con eso ya podemos escribir el denominador del Pareto: el total de la selección completa.
Ventas totales de la selección =
CALCULATE( [Ventas], ALLSELECTED( Clientes[Cliente] ) )
CALCULATE es la función que modifica el contexto de filtro antes de evaluar algo. Aquí le decimos: “calcula [Ventas], pero primero reemplaza el filtro sobre Cliente por la lista completa de la selección”. Resultado: 1,000,000 en todas las filas, que es exactamente lo que necesita un denominador.
2.6 Paso 3 - ADDCOLUMNS: construir una tabla virtual
Ya tenemos la lista de clientes. Pero una lista de nombres no basta: para acumular necesitamos saber cuánto vendió cada uno. ADDCOLUMNS toma una tabla y le agrega columnas calculadas al vuelo.
ADDCOLUMNS(
ALLSELECTED( Clientes[Cliente] ), -- tabla de partida
"@Ventas", [Ventas], -- columna nueva 1
"@Ranking", [Ranking de ventas] -- columna nueva 2
)
El resultado no existe en ninguna parte del modelo: es una tabla virtual que vive en memoria durante una fracción de segundo, se usa, y desaparece. Se parece a un papel de trabajo temporal: lo armas para resolver un cálculo y luego lo tiras.
| Cliente | @Ventas | @Ranking |
|---|---|---|
| Distribuidora Álamo | 400,000 | 1 |
| Grupo Bermejo | 250,000 | 2 |
| Constructora Cedral | 150,000 | 3 |
| Textiles del Norte | 90,000 | 4 |
| Aceros Poniente | 50,000 | 5 |
| Papelera Quiroga | 30,000 | 6 |
| Ferretería Solís | 20,000 | 7 |
| Vidrios Tepeyac | 10,000 | 8 |
Por qué la arroba. El prefijo
@en"@Ventas"no es obligatorio para DAX: es una convención de los profesionales para distinguir a simple vista una columna temporal de una columna real del modelo. Adóptala desde el principio; te ahorrará confusiones cuando las fórmulas crezcan.
2.6.1 La pregunta obligada: ¿por qué [Ventas] da un valor distinto en cada fila?
Buena observación. Dentro de ADDCOLUMNS, DAX recorre la tabla fila por fila. Al escribir [Ventas] -una medida- DAX la envuelve automáticamente en un CALCULATE invisible, y eso dispara un mecanismo llamado transición de contexto: el valor de la fila actual (por ejemplo, “Grupo Bermejo”) se convierte en un filtro real sobre el modelo.
Por eso [Ventas] devuelve 250,000 en la fila de Bermejo y 150,000 en la de Cedral. La regla práctica que debes memorizar: toda referencia a una medida dentro de un iterador se filtra automáticamente por la fila actual.
2.7 Paso 4 - RANKX: ordenar de mayor a menor
Un Pareto exige un orden: del que más vende al que menos. RANKX asigna esa posición.
Ranking de ventas =
RANKX(
ALLSELECTED( Clientes[Cliente] ), -- contra quién compito
[Ventas], -- con qué valor compito
, -- (argumento omitido)
DESC, -- mayor = lugar 1
Dense -- sin saltos en los empates
)
Argumento por argumento:
- tabla - El universo de comparación. Otra vez
ALLSELECTED: para saber qué lugar ocupa Cedral necesito verla junto a los demás, no sola. - expresión - El criterio de ordenamiento. Se evalúa para cada fila de la tabla anterior, con transición de contexto, igual que en
ADDCOLUMNS. - valor - Opcional, casi nunca se usa. Por eso queda la coma sola. Si lo omites, DAX usa el valor de la fila actual, que es lo que queremos.
- orden -
DESC= el valor más alto recibe el lugar 1. Si lo olvidas, DAX asumeASCy tu Pareto sale invertido: empieza por el cliente más pequeño. - empates -
Dense: dos empatados en 2.º lugar, el siguiente es 3.º.Skip(el valor por defecto): el siguiente sería 4.º. Para acumular, usaDense.
Por qué rankeamos en vez de comparar importes. La versión que verás en muchos blogs acumula filtrando
@Ventas >= ventas actuales. Funciona… hasta que dos clientes facturan exactamente lo mismo. Entonces cada uno se incluye a sí mismo y al otro, el acumulado se dispara y la curva da un salto imposible.Con importes redondeados -muy comunes en contabilidad: contratos, iguala mensual, rentas- los empates ocurren más de lo que crees. Rankear los elimina.
2.8 Paso 5 - FILTER y SUMX: acumular
Ya tenemos la tabla virtual con ventas y ranking. Acumular es ahora una sola idea: sumar las ventas de todos los que están en mi posición o antes.
FILTER( tabla, condición )recorre la tabla y se queda solo con las filas que cumplen la condición. Devuelve una tabla más chica.SUMX( tabla, expresión )recorre esa tabla, evalúa la expresión en cada fila y suma los resultados. Es un iterador: laXfinal siempre significa “fila por fila”.
Aquí está la medida completa:
Ventas acumuladas =
VAR RankActual = [Ranking de ventas]
VAR TablaVirtual =
ADDCOLUMNS(
ALLSELECTED( Clientes[Cliente] ),
"@Ventas", [Ventas],
"@Ranking", [Ranking de ventas]
)
RETURN
SUMX(
FILTER( TablaVirtual, [@Ranking] <= RankActual ),
[@Ventas]
)
Las VAR son variables: guardan un resultado con un nombre para que la fórmula se lea como un razonamiento y no como un trabalenguas. Además se calculan una sola vez, así que también mejoran el rendimiento. Úsalas siempre.
2.8.1 Traza completa: la celda de “Constructora Cedral”
Sigue el cálculo paso a paso, como si revisaras un asiento contable:
| Etapa | Qué ocurre |
|---|---|
RankActual |
El contexto de filtro es Cliente = "Constructora Cedral", y su ranking es 3. |
TablaVirtual |
Se construyen las 8 filas con sus ventas y su ranking (la tabla del Paso 3). |
FILTER |
Conserva las filas con @Ranking <= 3: Álamo, Bermejo y Cedral. Quedan 3 filas. |
SUMX |
Suma sus @Ventas: 400,000 + 250,000 + 150,000 = 800,000. |
Y ese mismo procedimiento se repite, íntegro, para cada una de las ocho celdas de la columna. Es costoso en cómputo, pero correcto y -lo más importante- se recalcula solo cuando el usuario cambia un filtro.
2.9 Paso 6 - DIVIDE: el porcentaje acumulado
% acumulado =
DIVIDE( [Ventas acumuladas], [Ventas totales de la selección] )
Usa DIVIDE y no el operador /. Si el denominador fuera cero o vacío -por ejemplo, porque el usuario filtró un periodo sin ventas- el operador / produce un error o infinito, y el visual se rompe. DIVIDE devuelve blank y el reporte simplemente muestra la celda vacía.
Dale formato de porcentaje en el panel de formato de la medida. No multipliques por 100: deja el valor como una proporción real para que se pueda comparar y combinar con otras medidas.
2.10 Paso 7 - Las medidas que responden la pregunta de negocio
La curva es bonita, pero un director financiero quiere una cifra. Estas dos medidas la dan:
Clientes que generan el 80% =
COUNTROWS(
FILTER( VALUES( Clientes[Cliente] ), [% acumulado] <= 0.8 )
)
% de clientes que generan el 80% =
DIVIDE(
[Clientes que generan el 80%],
COUNTROWS( ALLSELECTED( Clientes[Cliente] ) )
)
Puestas en dos tarjetas dicen: “3 clientes, el 37 % de la cartera, generan el 80 % de los ingresos”. Ese es el hallazgo; el gráfico solo lo sustenta.
2.10.1 Cómo armar el visual
- Visual Gráfico de líneas y columnas apiladas.
- Eje X:
Clientes[Cliente]· Columnas:[Ventas]· Línea:[% acumulado]. - Ordena el visual por
[Ventas], descendente (menú···→ Ordenar eje). Sin esto el Pareto no significa nada. - Eje Y secundario: fija inicio 0 y fin 1, para que la línea use toda la altura.
- Agrega una línea constante en 0.8 desde el panel de formato.
- Colorea las columnas por regla: Formato → Columnas → Color → fx → Estilo: valor del campo, usando una medida que devuelva
"#1F5D4C"si[% acumulado] <= 0.8y un gris en caso contrario.
2.11 Extensión: la clasificación ABC
El Pareto responde “¿cuántos?”. La clasificación ABC responde “¿y este de aquí, en qué grupo cae?”, que es lo que necesitas para operar: políticas de crédito distintas, frecuencia de visita distinta, alcance de auditoría distinto.
La convención más común en gestión de inventarios y cartera:
| Clase | Criterio sobre el % acumulado | Interpretación |
|---|---|---|
| A | ≤ 80 % | Los pocos vitales. Control individual. |
| B | > 80 % y ≤ 95 % | Zona intermedia. Control por excepción. |
| C | > 95 % | Los muchos triviales. Control agregado. |
Clase ABC =
VAR PctAcum = [% acumulado]
RETURN
SWITCH(
TRUE(),
PctAcum <= 0.80, "A",
PctAcum <= 0.95, "B",
"C"
)
Como es una medida y no una columna calculada, la clasificación es dinámica: si el usuario filtra a un año o a una región, un cliente puede pasar de C a A. Eso es correcto y es justamente lo que una columna calculada no puede hacer.
2.12 Errores frecuentes
- No ordenar el eje. El error más común y el más invisible: la fórmula está bien, pero la curva se ve como ruido.
- Usar
ALLen lugar deALLSELECTED. Todo funciona… hasta que alguien mueve un segmentador y los porcentajes ya no cierran en 100 %. - Resolverlo con una columna calculada. Se calcula una sola vez al actualizar y queda congelada. Con cualquier filtro muestra números equivocados sin dar ningún aviso. El Pareto debe hacerse con medidas.
- Olvidar
DESCenRANKX. Pareto invertido: la curva arranca casi plana y sube al final. - Importes negativos. Notas de crédito y devoluciones pueden dejar a un cliente en neto negativo; entonces la curva acumulada supera el 100 % y baja. No es un error de DAX, es una decisión de negocio: define si el Pareto se hace sobre venta bruta o neta, y decláralo.
- Aplicarlo a demasiadas categorías. El patrón
ADDCOLUMNS+FILTERcrece de forma cuadrática. Con miles de categorías el visual se vuelve lento; conviene agrupar antes.
2.13 (OPCIONAÑ) Ejercicio de calentamiento (individual, antes de la Parte III)
Este reto NO tienes que entregarlo, es práctica para que aterrices más los conceptos y practiques con implementación en PowerBI
Con el modelo de Andina Foods que ya tienes de los Workshops 2 y 3:
- Construye las cinco medidas del Pareto sobre Net Sales por cliente y reproduce la tabla objetivo. Verifica a mano que el acumulado del tercer cliente coincide con la suma de los tres primeros.
- Cambia
ALLSELECTEDporALLen las tres medidas donde aparece, agrega un segmentador de año y explica con números qué se rompe y por qué. - Quita
DESCdeRANKX. Describe la forma que toma la curva y por qué el análisis pierde sentido. - Repite el Pareto sobre gastos de marketing por país en lugar de ventas por cliente. ¿La concentración es mayor o menor? ¿Qué implica eso para la planeación de una auditoría?
3 PARTE II. El puente de Gross Profit (waterfall)
Esta parte explica en detalle el CHALLENGE 3 (opcional) del Workshop 3. Ahí se te dieron las fórmulas; aquí se explica de dónde salen, qué significan, y por qué el resultado cambia según el nivel de detalle al que las calcules.
3.1 Por qué un puente y no una tabla de variaciones
Reportar que “el gross profit bajó 11,805 dólares” no es análisis: es aritmética. La pregunta del CFO nunca es cuánto cambió, es por qué. Y “por qué” en contabilidad de gestión significa: ¿qué palanca del negocio se movió, y cuánto aportó cada una?
El puente (bridge o waterfall) es la herramienta estándar para responder eso. Es la misma lógica del análisis DuPont -descomponer un indicador en factores accionables- aplicada a una diferencia en lugar de a un nivel.
Un puente es útil solo si cumple dos condiciones:
- Es exacto: los efectos suman exactamente la diferencia observada. Sin residuos, sin “otros”.
- Es accionable: cada efecto corresponde a una decisión que alguien en la empresa toma. Volumen es del área comercial; precio es de pricing; costo es de compras/producción; mezcla es de estrategia de portafolio.
3.2 La identidad contable de partida
El gross profit de un periodo es:
\[ GP = \text{Net Sales} - \text{COGS} \]
Si definimos, para el periodo completo:
- \(Q\) = unidades vendidas
- \(P = \dfrac{\text{Net Sales}}{Q}\) = precio promedio realizado (ya neto de descuentos)
- \(C = \dfrac{\text{COGS}}{Q}\) = costo unitario promedio
entonces, por construcción:
\[ GP = Q \cdot P - Q \cdot C = Q\,(P - C) \]
Esto no es una aproximación: es una identidad. \(P\) y \(C\) son promedios ponderados definidos como cociente de dos sumas, exactamente la regla que venimos aplicando desde el Workshop 2 (nunca el promedio de una columna de razones).
El margen unitario \(m = P - C\) es la utilidad bruta que deja cada unidad vendida. El gross profit es simplemente cuántas unidades vendiste por cuánto te deja cada una.
3.3 La descomposición algebraica
Queremos explicar:
\[ \Delta GP = Q_1(P_1 - C_1) - Q_0(P_0 - C_0) \]
donde el subíndice 0 es el periodo base (por ejemplo 2024) y el 1 el periodo actual (2025). Sumamos y restamos el término \(Q_1(P_0 - C_0)\) -es decir, “¿cuánto habría sido el GP si hubiéramos vendido las unidades de 2025 con el margen unitario de 2024?”:
\[ \Delta GP = \underbrace{\big[Q_1(P_0-C_0) - Q_0(P_0-C_0)\big]}_{\text{cambio por unidades}} + \underbrace{\big[Q_1(P_1-C_1) - Q_1(P_0-C_0)\big]}_{\text{cambio por margen unitario}} \]
El primer corchete se factoriza como \((Q_1-Q_0)(P_0-C_0)\). El segundo se abre en su parte de precio y su parte de costo. El resultado es la descomposición que usaste en el Workshop 3:
\[ \Delta GP = \underbrace{(Q_1-Q_0)(P_0-C_0)}_{\text{efecto volumen}} + \underbrace{(P_1-P_0)\,Q_1}_{\text{efecto precio}} + \underbrace{-(C_1-C_0)\,Q_1}_{\text{efecto costo}} \]
Lee cada término como una frase:
| Efecto | Fórmula | Cómo se lee |
|---|---|---|
| Volumen | \((Q_1-Q_0)(P_0-C_0)\) | “Vendí \(\Delta Q\) unidades más, y cada una me dejaba el margen del año pasado.” |
| Precio | \((P_1-P_0)\,Q_1\) | “Mi precio realizado cambió \(\Delta P\), aplicado a todas las unidades que vendí este año.” |
| Costo | \(-(C_1-C_0)\,Q_1\) | “Mi costo unitario cambió \(\Delta C\); el signo va invertido porque un costo que sube resta utilidad.” |
Dos detalles que casi nadie explica y que debes entender:
- El efecto volumen usa el margen del año base (\(P_0 - C_0\)) y no el del año actual. Es deliberado: queremos aislar el crecimiento puro, valuado a las condiciones que ya conocíamos. Si usáramos el margen actual estaríamos mezclando dos cambios en un solo número.
- Los efectos precio y costo usan la cantidad del año actual (\(Q_1\)) y no la del año base. También es deliberado, y es lo que hace que la descomposición cierre exactamente. Más abajo se explica por qué.
3.4 Ejemplo numérico
Una empresa de un solo producto:
| Concepto | 2024 | 2025 |
|---|---|---|
| Unidades \(Q\) | 100,000 | 110,000 |
| Precio promedio \(P\) | 10.00 | 9.60 |
| Costo unitario \(C\) | 6.00 | 6.30 |
| Net Sales | 1,000,000 | 1,056,000 |
| COGS | 600,000 | 693,000 |
| Gross Profit | 400,000 | 363,000 |
\[\text{Volumen} = (110{,}000 - 100{,}000)\times(10.00-6.00) = +40{,}000\] \[\text{Precio} = (9.60-10.00)\times 110{,}000 = -44{,}000\] \[\text{Costo} = -(6.30-6.00)\times 110{,}000 = -33{,}000\]
Suma: \(+40{,}000 - 44{,}000 - 33{,}000 = -37{,}000\), que es exactamente \(363{,}000 - 400{,}000\). Cierra.
La lectura ejecutiva es inmediata y no requiere que nadie mire una tabla: “crecimos 10 % en volumen, lo que aportó 40 mil dólares, pero lo perdimos todo y más: bajamos el precio realizado 4 %, que costó 44 mil, y el costo unitario subió 5 %, que costó otros 33 mil.”
3.5 El término de interacción: por qué desaparece
Si eres cuidadoso notarás que la descomposición no es única. Podemos escribirla también así:
\[ \Delta GP = \underbrace{\Delta Q\,(P_0-C_0)}_{\text{volumen}} + \underbrace{Q_0\,(\Delta P - \Delta C)}_{\text{margen}} + \underbrace{\Delta Q\,(\Delta P - \Delta C)}_{\text{interacción}} \]
El tercer término -el efecto de interacción o joint effect- es la parte del cambio que no se puede atribuir limpiamente a una sola causa: es “el efecto de haber vendido más unidades y además a distinto margen”. En el ejemplo vale \(10{,}000 \times (-0.40 - 0.30) = -7{,}000\).
Existen tres convenciones para tratarlo, y debes declarar cuál usas:
| Convención | Qué hace con la interacción | Uso típico |
|---|---|---|
| Laspeyres (base) | La deja como un cuarto efecto explícito. | Análisis técnico, índices de precios. |
| Paasche (actual) | La absorbe en precio y costo, usando \(Q_1\). | La que usamos aquí y la estándar en reportes de gestión. |
| Shapley / promedio | La reparte a la mitad entre los efectos. | Literatura académica; poco común en la práctica. |
Usar \(Q_1\) en los efectos precio y costo es, precisamente, absorber la interacción dentro de ellos. Es la convención de reporting: un cuarto efecto llamado “interacción” no le dice nada a nadie en un comité de dirección, y no corresponde a ninguna decisión que alguien pueda tomar. Lo importante es la consistencia: elige una y úsala siempre, y menciónala en las notas del reporte.
3.6 El efecto mezcla: por qué el puente a nivel compañía puede mentir
Este es el punto conceptual más importante de toda la Parte II, y es lo que se preguntaba en el Q5 del Workshop 3.
El precio promedio \(P\) de la compañía no es un precio: es un promedio ponderado de los precios de todos los productos, donde las ponderaciones son las cantidades vendidas. Y esas ponderaciones cambian de un año a otro. Entonces \(P\) puede moverse sin que ningún producto haya cambiado de precio, simplemente porque vendiste más de los baratos y menos de los caros.
Cuando eso pasa, el puente a nivel compañía sigue siendo exacto (suma bien), pero atribuye mal: reporta un “efecto precio” negativo enorme que ningún gerente de pricing provocó.
3.6.1 Ejemplo mínimo que lo demuestra
Dos productos, y ningún precio ni costo cambió en todo el periodo:
| Producto | \(P\) | \(C\) | margen \(m\) | \(Q_{2024}\) | \(Q_{2025}\) |
|---|---|---|---|---|---|
| A (económico) | 10 | 6 | 4 | 100,000 | 150,000 |
| B (premium) | 20 | 12 | 8 | 100,000 | 50,000 |
- GP 2024 \(= 100{,}000(4) + 100{,}000(8) = 1{,}200{,}000\)
- GP 2025 \(= 150{,}000(4) + 50{,}000(8) = 1{,}000{,}000\)
- \(\Delta GP = -200{,}000\)
Ahora el puente a nivel compañía. Las unidades totales son 200,000 en ambos años, así que \(\Delta Q = 0\):
- \(P_0 = \frac{1{,}000{,}000+2{,}000{,}000}{200{,}000} = 15.00\) ; \(P_1 = \frac{1{,}500{,}000+1{,}000{,}000}{200{,}000} = 12.50\)
- \(C_0 = \frac{600{,}000+1{,}200{,}000}{200{,}000} = 9.00\) ; \(C_1 = \frac{900{,}000+600{,}000}{200{,}000} = 7.50\)
\[\text{Volumen} = 0 \qquad \text{Precio} = -2.50\times200{,}000 = -500{,}000 \qquad \text{Costo} = +1.50\times200{,}000 = +300{,}000\]
Suma \(-200{,}000\): exacto. Y sin embargo el diagnóstico es completamente falso: dice que perdiste medio millón por precio y recuperaste 300 mil por costo, cuando en realidad ningún precio y ningún costo se movió un centavo.
3.6.2 La versión correcta
Si calculas el puente producto por producto y sumas, cada producto tiene \(\Delta P = \Delta C = 0\), así que los efectos precio y costo son cero, y todo el cambio queda en volumen:
\[\text{Volumen}_A = +50{,}000 \times 4 = +200{,}000 \qquad \text{Volumen}_B = -50{,}000 \times 8 = -400{,}000\]
Total \(-200{,}000\). También exacto, pero ahora el diagnóstico es correcto: el problema es de portafolio, no de pricing ni de compras.
Y todavía se puede afinar. El efecto volumen agregado por producto contiene en realidad dos cosas mezcladas, y se separan así:
\[ \underbrace{\sum_i \Delta Q_i\,m_{i,0}}_{\text{volumen por producto}} = \underbrace{\Delta Q_{\text{total}} \cdot \bar{m}_0}_{\textbf{volumen puro}} + \underbrace{\left(\sum_i \Delta Q_i\,m_{i,0} - \Delta Q_{\text{total}}\cdot\bar{m}_0\right)}_{\textbf{efecto mezcla}} \]
donde \(\bar m_0\) es el margen unitario promedio de la compañía en el año base.
- Volumen puro: cuánto habría cambiado el GP si hubieras vendido \(\Delta Q\) unidades adicionales manteniendo la misma mezcla de productos.
- Mezcla: cuánto cambió el GP porque la composición de lo que vendes se movió hacia productos de mayor o menor margen.
En el ejemplo: volumen puro \(= 0 \times 6 = 0\), y mezcla \(= -200{,}000 - 0 = -200{,}000\). Todo el deterioro es mezcla. Eso sí es un hallazgo que un CFO puede accionar.
La regla que debes recordar. El puente calculado sobre promedios de compañía siempre suma bien y frecuentemente diagnostica mal. Calcula los efectos precio y costo al nivel de detalle donde el precio y el costo realmente existen -el producto, o al menos la subcategoría- y agrégalos hacia arriba. La diferencia entre el efecto volumen agregado y el volumen puro tiene un nombre en contabilidad administrativa: efecto mezcla (sales mix variance).
3.7 Las medidas DAX
Primero las auxiliares del año anterior (mismo patrón del Workshop 3):
Units Sold LY = CALCULATE( [Units Sold], SAMEPERIODLASTYEAR('Calendar'[Date]) )
Net Sales LY = CALCULATE( [Net Sales], SAMEPERIODLASTYEAR('Calendar'[Date]) )
COGS LY = CALCULATE( [COGS], SAMEPERIODLASTYEAR('Calendar'[Date]) )
Gross Profit LY= CALCULATE( [Gross Profit], SAMEPERIODLASTYEAR('Calendar'[Date]) )
Avg Price LY = DIVIDE( [Net Sales LY], [Units Sold LY] )
Avg Cost LY = DIVIDE( [COGS LY], [Units Sold LY] )
GP Change = [Gross Profit] - [Gross Profit LY]
Versión a nivel del contexto actual (la del Workshop 3):
Volume Effect = ( [Units Sold] - [Units Sold LY] ) * ( [Avg Price LY] - [Avg Cost LY] )
Price Effect = ( [Avg Price] - [Avg Price LY] ) * [Units Sold]
Cost Effect = - ( [Avg Cost] - [Avg Cost LY] ) * [Units Sold]
Puestas en una matriz por producto, estas tres medidas se evalúan dentro del contexto de cada producto y por lo tanto son correctas. El problema aparece en la fila de totales, donde se recalculan con los promedios de la compañía. Por eso el total de la matriz no coincide con la suma de sus filas: no es un error de Power BI, es el efecto mezcla apareciendo.
Versión correcta a cualquier nivel: se itera sobre el producto y se suma, de modo que el total sea la suma de los detalles.
Price Effect (por producto) =
SUMX(
VALUES( Products[ProductID] ),
( [Avg Price] - [Avg Price LY] ) * [Units Sold]
)
Cost Effect (por producto) =
SUMX(
VALUES( Products[ProductID] ),
- ( [Avg Cost] - [Avg Cost LY] ) * [Units Sold]
)
Volume + Mix Effect =
SUMX(
VALUES( Products[ProductID] ),
( [Units Sold] - [Units Sold LY] ) * ( [Avg Price LY] - [Avg Cost LY] )
)
Pure Volume Effect =
( [Units Sold] - [Units Sold LY] )
* DIVIDE( [Gross Profit LY], [Units Sold LY] )
Mix Effect = [Volume + Mix Effect] - [Pure Volume Effect]
Recuerda por qué esto funciona: dentro de SUMX( VALUES(...) ) cada medida se evalúa con transición de contexto, es decir, filtrada por el producto de la fila actual -exactamente el mismo mecanismo que estudiamos en el Paso 3 del Pareto.
Verificación obligatoria. Escribe esta medida y ponla en una tarjeta; debe dar cero (o un redondeo despreciable) en cualquier selección de filtros:
Bridge Check =
[GP Change]
- ( [Pure Volume Effect] + [Mix Effect]
+ [Price Effect (por producto)] + [Cost Effect (por producto)] )
Si no da cero, tu puente no es un puente: es una lista de números sueltos.
3.8 Cómo construir el gráfico de cascada en Power BI
El visual nativo Waterfall chart de Power BI no sabe descomponer nada por sí solo: solo dibuja la secuencia de valores que le des. La técnica estándar es una tabla puente desconectada.
1. Crea una tabla manual (Inicio → Escribir datos / Enter data), sin ninguna relación con el resto del modelo:
| Orden | Paso |
|---|---|
| 1 | GP año anterior |
| 2 | Volumen |
| 3 | Mezcla |
| 4 | Precio |
| 5 | Costo |
Ordena la columna Paso por la columna Orden (Herramientas de columna → Ordenar por columna). Sin esto los pasos aparecerán en orden alfabético y la cascada no tendrá sentido.
2. Escribe una medida despachadora que devuelva el valor que corresponde al paso visible:
Bridge Value =
SWITCH(
SELECTEDVALUE( Bridge[Paso] ),
"GP año anterior", [Gross Profit LY],
"Volumen", [Pure Volume Effect],
"Mezcla", [Mix Effect],
"Precio", [Price Effect (por producto)],
"Costo", [Cost Effect (por producto)],
BLANK()
)
SELECTEDVALUE devuelve el único valor visible de una columna, o BLANK() si hay más de uno. Como la tabla está desconectada, no filtra a Sales: solo sirve como eje de categorías, y cada categoría “pregunta” por su propia medida.
3. Configura el visual: Waterfall chart, Categoría = Bridge[Paso], Eje Y = [Bridge Value]. Power BI dibuja cada barra como un delta sobre la anterior y agrega automáticamente una barra Total al final, que será el gross profit del año actual. Formatea en verde los aumentos, en rojo las disminuciones, y en gris/negro las barras de total.
4. Añade contexto: al lado del waterfall, una matriz con los mismos efectos por división o subcategoría, ordenada por el efecto que domine. La cascada dice qué pasó; la matriz dice dónde.
3.9 Cómo se lee un puente (y errores frecuentes)
- Se lee de izquierda a derecha como una narración, no como una tabla. El orden convencional es: volumen → mezcla → precio → costo, es decir, de lo más “comercial” a lo más “operativo”.
- Escala: nunca dejes que Power BI empiece el eje en cero si los efectos son pequeños frente al nivel del GP; las barras se vuelven invisibles. Ajusta el mínimo del eje.
- Etiqueta cada barra con su valor. Un waterfall sin etiquetas de datos obliga al lector a estimar alturas, que es justo lo que un puente debe evitar.
Errores frecuentes:
- Comparar periodos de distinta duración. Si 2025 solo tiene datos hasta octubre y 2024 está completo, el efecto volumen absorberá la diferencia de calendario y el puente será basura. Usa
SAMEPERIODLASTYEARcon un rango equivalente, oDATESYTD. - Usar precio de lista en lugar de precio realizado. \(P\) debe salir de Net Sales, ya neto de descuentos y devoluciones. Si usas el precio de lista, el efecto descuento desaparece del análisis.
- Olvidar el signo del efecto costo. Es el error aritmético más común: un costo que sube produce un efecto negativo.
- Productos nuevos y descontinuados. Si un producto solo existe en un año, \(P_0\) o \(Q_0\) no están definidos y las divisiones producen blank. Decide explícitamente cómo tratarlos -lo habitual es asignarles todo su GP al efecto volumen- y decláralo en las notas.
- Presentar el puente sin la verificación. Siempre muestra que los efectos suman la diferencia. Es lo primero que revisa un auditor.
4 PARTE III. Retos con un dataset nuevo: Contoso
A partir de aquí no hay instrucciones paso a paso. Ya sabes importar, modelar, escribir medidas y construir visuales. Lo que sigue son objetivos de negocio; el camino lo eliges tú.
4.1 El caso
Contoso Electronics es un minorista global de electrónica de consumo: cámaras, computadoras, audio, video, telefonía y electrodomésticos. Vende a través de cuatro canales -tiendas físicas, tienda en línea, catálogo y distribuidores (reseller)- en 32 países.
La dirección general te plantea dos preocupaciones:
“Primera: sospecho que dependemos de muy pocos productos y de muy pocos mercados, pero nadie me ha puesto un número encima de esa sospecha.
Segunda, y más urgente: en el último año vendimos más unidades que nunca y aun así la utilidad bruta no creció. Necesito saber si eso fue precio, costo o algo más, y quiero verlo en una sola imagen.”
4.2 Los datos
El archivo W4_ContosoSalesData.xlsx está en la carpeta datosWorkshops y contiene seis hojas. Es un extracto limpio: no hay duplicados, no hay claves huérfanas y las fechas están bien tipificadas. Aun así, verifícalo con la auditoría de cinco puntos del Workshop 2 y repórtalo.
4.2.1 Sales Data - TABLA DE HECHOS (1,006 filas)
| Columna | Significado |
|---|---|
SalesKey |
Identificador único de la línea de venta |
DateKey |
Fecha de la transacción |
channelKey |
Canal de venta (ver catálogo abajo) |
StoreKey |
FK → Stores |
ProductKey |
FK → Product |
PromotionKey |
Promoción aplicada (sin tabla de dimensión en este extracto) |
CurrencyKey |
Moneda (constante = 1, USD) |
UnitCost |
Costo unitario de la transacción |
UnitPrice |
Precio unitario de venta de la transacción |
SalesQuantity |
Unidades vendidas |
ReturnQuantity |
Unidades devueltas de esa línea |
ReturnAmount |
Importe devuelto ( = ReturnQuantity × UnitPrice ) |
DiscountAmount |
Descuento otorgado, importe total de la línea (no unitario) |
4.2.2 Product - DIMENSIÓN (1,690 filas)
ProductKey, ProductName, ProductDescription, ProductSubcategoryKey, UnitCost, UnitPrice, Shipping fee.
Ojo:
UnitCostyUnitPriceaquí son valores de lista del catálogo. Los deSales Datason los realizados en cada transacción. Todo cálculo monetario se hace con los deSales Data; los deProductte sirven para medir desviaciones contra lista.
4.2.3 Subcategory - DIMENSIÓN (44 filas)
ProductSubcategoryKey, ProductSubcategoryName, ProductSubcategoryDescription.
4.2.4 Stores - DIMENSIÓN (306 filas)
StoreKey, GeographyKey, StoreManager, StoreType, StoreName.
4.2.5 Geography - DIMENSIÓN (674 filas)
GeographyKey, GeographyType, ContinentName, CityName, StateProvinceName, RegionCountryName.
Cuidado con esta tabla. Contiene filas de granularidad mixta: continentes, países, estados y ciudades, marcadas en
GeographyType. Solo las filas de tipoCityson referenciadas porStores; en las demás,CityNameyStateProvinceNamevienen vacías. La relación conStoressigue siendo 1:N válida, pero si arrastrasCityNamesin pensar tendrás categorías en blanco en tus visuales. Decide cómo tratarlo y justifícalo.
4.2.6 Calendar - DIMENSIÓN DE FECHA (1,096 filas)
Una sola columna, Date, del 2007-01-01 al 2009-12-31. Tendrás que enriquecerla tú con año, trimestre, número de mes y nombre de mes, y marcarla como tabla de fechas.
4.2.7 Catálogo de canales
No hay tabla de dimensión para el canal. El catálogo del ERP es:
channelKey |
Canal |
|---|---|
| 1 | Store |
| 2 | Online |
| 3 | Catalog |
| 4 | Reseller |
4.3 Convenciones que debes definir (y declarar)
Antes de escribir una sola medida, decide y documenta en una nota tu definición de:
- Net Sales. La convención recomendada: \(\text{SalesQuantity}\times\text{UnitPrice} - \text{DiscountAmount} - \text{ReturnAmount}\).
- Unidades netas: \(\text{SalesQuantity} - \text{ReturnQuantity}\).
- COGS: unidades netas ×
UnitCostde la transacción. - Gross Profit y GP Margin como en los workshops anteriores.
Puedes elegir otra convención, pero entonces explica por qué y sé consistente en los dos dashboards.
Checkpoint de validación. Con todo el periodo 2007-2009 y sin filtros, tu Net Sales consolidado debe quedar entre USD 3.7 y 3.8 millones y tu GP Margin alrededor del 57 %. Si no es así, detente y depura antes de construir cualquier visual.
Nota sobre moneda. A diferencia de Andina Foods, aquí todo está en una sola moneda: no hay conversión que hacer. La complejidad de este dataset está en otro lado -granularidad mixta de geografía, dimensión de canal inexistente, calendario incompleto, devoluciones.
4.4 RETO 1 - Dashboard “Concentración y riesgo de portafolio”
Página de reporte: 1-CONCENTRACIÓN.
Objetivo: cuantificar de qué tan pocas cosas depende Contoso, y si las cosas de las que depende para vender son las mismas de las que depende para ganar.
Indicadores y visuales que como mínimo debe contener:
- Un análisis de Pareto completo de Net Sales por producto: barras ordenadas descendentemente, línea de % acumulado, línea de referencia en 80 %.
- Tarjetas con: número de productos que generan el 80 % de las ventas, y ese número como porcentaje del catálogo vendido.
- Una clasificación ABC de productos y una tabla o matriz que muestre, por clase A / B / C: número de productos, Net Sales, Gross Profit, GP Margin y unidades. La pregunta que debe contestar esa tabla es si los productos de clase A son también los más rentables.
- Un segundo Pareto, sobre Gross Profit en vez de Net Sales, en la misma página o en una comparativa. Los “pocos vitales” de una y otra lista no son los mismos; tu dashboard debe hacer visible esa diferencia.
- Concentración geográfica y de canal: cuántos países concentran el 80 % de las ventas, y cómo se reparten las ventas y el margen entre los cuatro canales.
- Al menos un indicador de riesgo diseñado por ti (por ejemplo, participación del país o del producto número uno, un índice de concentración, o el número de tiendas necesarias para llegar al 80 %). Justifica por qué lo elegiste.
- Segmentadores: año, canal, continente y subcategoría. Verifica que todos los porcentajes acumulados siguen cerrando en 100 % al mover cualquier segmentador; si no, revisa tu uso de
ALLSELECTED.
4.4.1 Preguntas del Reto 1
Q1. ¿Cuántos productos generan el 80 % de las ventas y qué porcentaje del catálogo vendido representan? ¿Se cumple el “80/20”? Reporta la proporción que realmente encontraste e interprétala.
Q2. Construye el Pareto sobre Gross Profit. ¿Cuántos productos de los que están en el 80 % de ventas no están en el 80 % de utilidad? Nombra dos de ellos y explica qué los caracteriza.
Q3. ¿Cuál es el GP Margin de la clase A frente al de la clase C? Si tuvieras que descontinuar la mitad de los productos clase C, ¿qué porcentaje de las ventas y qué porcentaje de la utilidad estarías arriesgando?
Q4. ¿Qué porcentaje de las ventas viene del país número uno? ¿Qué riesgo genera esa concentración y qué indicador propondrías monitorear mensualmente para vigilarlo?
Q5. Explica tu indicador de riesgo propio: qué mide, cómo lo calculaste y qué valor te parecería una señal de alerta.
4.5 RETO 2 - Dashboard “Crecimiento y puente de Gross Profit”
Página de reporte: 2-CRECIMIENTO Y PUENTE.
Objetivo: explicar, con una sola imagen, por qué la utilidad bruta no creció aunque el negocio movió más unidades.
Advertencia de periodo. El dataset arranca en 2007, así que ese año no tiene comparativo. Todo tu análisis de crecimiento vive en 2008 y 2009.
Indicadores y visuales que como mínimo debe contener:
- Tarjetas de crecimiento anual: % de crecimiento de Net Sales, de unidades netas, de Gross Profit, y la variación del GP Margin en puntos porcentuales. Todas con Time Intelligence, no con columnas calculadas.
- Un gráfico de líneas o columnas de Net Sales y Gross Profit por año/trimestre, que haga visible simultáneamente la tendencia y la estacionalidad.
- El gráfico de cascada del cambio de Gross Profit del último año contra el anterior, construido con la técnica de la Parte II (tabla puente desconectada +
SWITCH), con al menos los efectos volumen puro, mezcla, precio y costo. - Una medida de verificación (
Bridge Check) visible en una tarjeta, que demuestre que los efectos suman exactamente el cambio de gross profit. - Una matriz de los mismos efectos por subcategoría, ordenada por el efecto dominante, para localizar dónde se originó el cambio.
- Un análisis de crecimiento por país y por canal: quién creció, quién cayó, y cuánto contribuyó cada uno al cambio total de gross profit (no solo su % de crecimiento: también su contribución en dólares).
- Un visual o tabla, diseñado por ti, que sustente tu explicación del cambio en el precio promedio realizado de la compañía.
- Segmentadores: año, canal, continente, subcategoría.
4.5.1 Preguntas del Reto 2
Q6. ¿Cuánto cambió el Gross Profit del último año contra el anterior, en dólares y en porcentaje? ¿Y las unidades netas? Describe la aparente contradicción en una frase.
Q7. Calcula el puente usando los promedios de la compañía (efecto volumen, precio y costo, sin abrir por producto). Reporta los tres números. ¿Qué diagnóstico sugieren? ¿Te parece creíble?
Q8. Ahora calcula los efectos precio y costo iterando por producto. Compáralos con los del punto anterior. ¿Qué tan grandes resultaron? Con eso en la mano, ¿cuál es la explicación verdadera de lo que pasó con la utilidad bruta? Nombra el efecto responsable.
Q9. Cuantifica el efecto mezcla y explícalo en términos de negocio: ¿hacia qué subcategorías se movieron las ventas y qué margen unitario tienen esas subcategorías frente a las que perdieron participación?
Q10. Escribe una nota de hallazgos de media página dirigida a la dirección general con: (a) el diagnóstico cuantificado con el puente; (b) un objetivo SMART para el año siguiente; (c) una acción concreta, el supuesto sobre el que descansa, y su impacto esperado sobre el gross profit en dólares; (d) las limitaciones de tu análisis -al menos: qué hiciste con productos que solo existen en un año, cómo trataste las devoluciones, y qué implica que el extracto tenga solo 1,006 líneas de venta.
Una nota que dice “el margen se deterioró, hay que mejorarlo” no vale nada. Una nota que dice “el gross profit cayó USD X (-X %) pese a vender X % más unidades; el efecto volumen puro aportó +USD X, pero un efecto mezcla de -USD X lo anuló, porque las ventas se desplazaron de subcategoría A (margen unitario USD X) hacia subcategoría B (margen unitario USD X); recuperar la mezcla de 2008 en subcategoría A valdría aproximadamente USD X” es una nota por la que te contratan. Llena cada número en cursivas con tu propio modelo.
5 Entregables
Entrega por Canvas:
- El archivo
.pbixdel reporte de Contoso (Archivo → Descargar este archivo). - Un documento PDF o Word que contenga:
- Capturas de las dos páginas del reporte.
- Tu bitácora de decisiones: resultado de la auditoría de integridad, tratamiento de la geografía de granularidad mixta, definición de Net Sales / unidades netas / COGS que adoptaste, y tratamiento de productos que solo existen en un año.
- Tus respuestas escritas a Q1-Q10, con números.
- La nota de hallazgos de Q10.
- Evidencia de que tu
Bridge Checkda cero.
6 Rúbrica de evaluación
| Criterio | Peso | Qué obtiene el crédito completo |
|---|---|---|
| Pareto (calentamiento + Reto 1) | 20 % | Medidas de Pareto correctas con ALLSELECTED y RANKX; % acumulado que cierra en 100 % bajo cualquier segmentador; clasificación ABC como medida, no como columna calculada |
| Modelo semántico de Contoso | 15 % | Relaciones con cardinalidad y dirección correctas; calendario enriquecido y marcado como tabla de fechas; tabla de canales creada y relacionada; geografía de granularidad mixta tratada y justificada; columnas técnicas ocultas |
| DAX del puente | 30 % | Medidas LY con Time Intelligence; efectos precio y costo iterados por producto; volumen puro y mezcla correctamente separados; Bridge Check en cero |
| Dashboards | 20 % | Dos páginas completas, legibles, formateadas, ordenadas con sentido, segmentadores funcionales; waterfall bien construido y etiquetado |
| Hallazgos y nota | 15 % | Q1-Q10 respondidas con números; el efecto responsable correctamente identificado y explicado en términos de negocio; objetivo SMART; limitaciones reconocidas |
Deducciones automáticas. Cualquier razón calculada como promedio aritmético de una columna de razones: -10 %. Un Pareto resuelto con columna calculada en lugar de medidas: -10 %. Un waterfall cuyos efectos no suman el cambio de gross profit, sin declararlo: -10 %. Un reporte sin formato -decimales crudos, títulos por defecto, sin separadores de miles: -5 %.
7 Apéndice - Referencia rápida de DAX
| Tarea | Patrón |
|---|---|
| División segura | DIVIDE( [Numerador], [Denominador] ) |
| Traer una columna del lado uno | RELATED( Dim[Columna] ) |
| Conteo distinto | DISTINCTCOUNT( Ventas[OrderID] ) |
| Mismo periodo del año anterior | CALCULATE( [Medida], SAMEPERIODLASTYEAR('Calendar'[Date]) ) |
| Crecimiento anual % | DIVIDE( [Medida] - [Medida LY], [Medida LY] ) |
| Lista de la selección del usuario | ALLSELECTED( Dim[Columna] ) |
| Ignorar todos los filtros | ALL( Tabla ) |
| Participación sobre el total visible | DIVIDE( [Medida], CALCULATE([Medida], ALLSELECTED()) ) |
| Tabla virtual con columnas al vuelo | ADDCOLUMNS( Tabla, "@Col", [Medida] ) |
| Ranking descendente sin saltos | RANKX( ALLSELECTED(Dim[Col]), [Medida], , DESC, Dense ) |
| Acumulado tipo Pareto | SUMX( FILTER( TablaVirtual, [@Ranking] <= RankActual ), [@Ventas] ) |
| Top N por una medida | TOPN( 10, VALUES(Dim[Clave]), [Medida], DESC ) |
| Iterar sobre una dimensión | SUMX( VALUES(Dim[Clave]), <expresión> ) |
| Clasificación por umbrales | SWITCH( TRUE(), cond1, val1, cond2, val2, valDefault ) |
| Valor único visible de una columna | SELECTEDVALUE( Bridge[Paso] ) |
8 Qué sigue
Con este workshop cierras el ciclo del módulo: sabes construir un modelo correcto, escribir medidas que respetan el contexto de filtro, medir concentración y descomponer un cambio en las palancas que lo provocaron. Esas tres habilidades -modelar, medir, descomponer- son el núcleo de la analítica contable. Lo que sigue en el curso es aplicarlas a decisiones: presupuestos, escenarios y proyecciones.