Cálculos Complejos con DAX y Evaluación de Contextos en Power BI
Resumen
¿Cómo podemos profundizar en la función Calculate de Power BI?
Calculate es una función de Power BI que nos permite realizar cálculos dinámicos y complejos utilizando la evaluación de contextos. Entender su uso es fundamental para resolver preguntas de negocio que requieren análisis detallados. ¿Cómo empezamos? Primero, generamos una medida llamada 'Total Venta Onda'. La fórmula básica sería:
Total Venta Onda = CALCULATE([Total Venta], Marca = "Onda")
Esta medida nos muestra las ventas totales de la marca Onda. Al aplicar esto en una tabla, podemos observar cómo se comporta el cálculo para las diferentes categorías de marca. ¿Qué sucede si cambiamos el contexto con una tabla que incluye marcas variadas? Al utilizar Calculate, la función itera y genera valores de tabla ajustados al contexto de cada marca.
¿Cómo creamos medidas complejas con múltiples condiciones?
Avanzando en nuestra comprensión, podemos desarrollar medidas que incluyan varias marcas. Por ejemplo, creamos 'Total Venta Onda Toyota', que suma las ventas de ambas marcas:
Total Venta Onda Toyota = CALCULATE([Total Venta], IN(Marca, {"Toyota", "Onda"}))
Esta medida se lleva a una tabla y se filtra solo por las variables integradas, mostrando que la función Calculate modifica contextos según la lógica aplicada.
¿Cómo utilizamos la evaluación de contextos para escenarios complejos?
La evaluación de contextos se vuelve esencial cuando tratamos con preguntas y escenarios complejos de negocio. Supongamos que queremos identificar a los vendedores cuyas ventas superan los 30 millones. Podemos crear una medida como sigue:
Después, al ordenar los vendedores según sus ventas, descubrimos que solo unos pocos superan esa cifra. La utilidad de esta medida es clara: con una sola expresión y sus filtros asociados, redujimos el conjunto de datos para enfocarnos en nuestro interés específico.
¿Cómo nos beneficia el cálculo contextual?
El conocimiento de Calculate y la evaluación de contextos proporciona una ventaja competitiva notable. Se convierte en una herramienta poderosa para manejar diversas demandas del negocio al permitirnos generar tablas sofisticadas y evaluaciones precisas. Adquiriendo habilidades avanzadas en DAX, como iteradores y rankings, podemos enfrentar desafíos que requieren acotar información a través de contextos de cálculo específicos.
En resumen, el manejo de Power BI y Calculate, combinados con la evaluación de contextos, potencia nuestra capacidad de abordar complejidades empresariales con soluciones personalizadas y precisas. Adelante, practica, desafíate a crear soluciones innovadoras y comparte tus logros con la comunidad para seguir aprendiendo y creciendo en el mundo del análisis de datos.
Ya entendí porque no me funcionaba la misma medida que se hizo para vendedor >30 mill, cuando trataba de invocar la medida total ventas
y es porque la tabla Fac_Ventas no tiene el campo de marca de vehiculos, mientras que si contiene el campo vendedor por eso si se intenta invocar esta medida no la reconoce y por eso hay que hacer el sum nuevamente
Hola Cindy, me surge una duda, es la siguiente:
La relacion que hay entre Fact_Ventas y Dim_vendedor es a traves del id del vendedor.
Lo mismo sucede con la tabla dim_vehiculo, no? Es decir, se conecta la tabla Fact_ventas con dim_vehiculo a traves del campo id del vehiculo.
Gracias ✌️
Correcto @andersoncrs,
la relación entre las tablas Fact_ventas con Dim_Vendedor es la misma que la relación Fact_Ventas con Dim_Vehiculos, por lo que debería poder calcular la medida "Total Ventas" de igual forma, sin tener que añadir el sum.
Este video me crea mas dudas que las que resuelve.
Trate la de los compañeros pero no me dio, porque al final el total me seguía saliendo con 359,547,368.20, que no es el total de las marcas de >50MM, por lo cual procedí a hacer 2 cálculos adicionales, uno para un total que no se viera afectado por marca_vehículo y otro para el contexto de las Marcas>50M, les comparto lo que me funció
Total de Ventas 2 = CALCULATE(SUM(Fact_Ventas[Precio Venta sin IGV]),ALLEXCEPT(dim_vehiculo,dim_vehiculo[marca_vehiculo]))
Marcas>50M = CALCULATE([Total de Ventas 2],FILTER(dim_vehiculo,[Total de Ventas 2]>50000000))
Si funciona, excelente
Funciona, casi no me da porque te presionado una celda de una tabla
Me paso lo mismo que el compañero Jefferson Osorio Lozano , me toco realizar 2 calculos donde tocaba sacar el total de ventas de la tabla dado que por los filtros no lo pude realizar de forma directa
Paso 1
Paso 2
Muy buen aporte Nicolas!
Muchas gracias, esta es la solucion ideal.
Otros hablaban de utilizar la funcion sum dentro del filter pero no arroja el total correcto en la tabla final
En tu caso, sí lo arroja.
Un crack!
1: ¿Suzuki? Acá debería llamar la atención que aparezca Suzuki cuando se acaba de hacer un IN con TOYOTA y HONDA, además de que aparecen dos modelos y no los 6 modelos.
2: Es porque toma el campo "marca_vehiculo" de la tabla "Marca Top" en lugar de la tabla "dim_vehiculo" es la se acaba de referenciar en la fórmula.
Note el mismo error y para corregirlo hay que usar la función FILTER, te adjunto una imagen para que te guíes
No usar la tabla, MarcaTop, cambiala por dim_vehiculo
De algo me sirvió el curso de fundamentos de base de datos.
Brands_Over_50M=CALCULATE([Total de Ventas],FILTER(VALUES(dim_vehiculo[marca_vehiculo]),CALCULATE([Total de Ventas],ALL(dim_vehiculo), dim_vehiculo[marca_vehiculo]=EARLIER(dim_vehiculo[marca_vehiculo]))>50000000))
gracias por la respuesta
Gracias, es posible que puedas explicar el código de manera general
Mi solución:
Venta marca vehiculo mayor >50000000=CALCULATE([Total de ventas],FILTER(dim_vehiculo,sum(Fact_Ventas[PrecioVenta sin IGV])>50000000))
Gracias Daniel, coincido totalmente con esta opción. Ventas x Marca >50mill = CALCULATE([Total de ventas], FILTER(dim_vehiculo, sum(Fact_Ventas[Precio Venta sin IGV]) > 50000000))
Gracias por la respuesta, porque no funciona cuando el fitro se realiza sobre el total de ventas?
Una consulta, porque cuando se hace el calculo para TOYOTA y HONDA, el cuadro arroja los nombres TOYOTA y SUZUKI? Me refiero al ejemplo del minuto 3:07.
Creo que la formula esta mal. Prueba con estas:
Total de venta Honda - Toyota = CALCULATE([Total de Ventas], FILTER(dim_vehiculo,[marca_vehiculo] IN {"TOYOTA", "HONDA"}) )
Ciertamente debe haber un error porque al mostrar el resultado no debe dar Suzuki sino Honda. Y completo el aporte de Diego Leandro Suarez (al copiar omitió una frase de la función), para que sólo muestre las dos marcas Toyota y Honda al hacer el gráfico. Sin Filter muestra todas las marcas como en el primer ejemplo de la clase.
Total Venta Honda+Toyota = CALCULATE([Total de Ventas],FILTER(dim_vehiculo, dim_vehiculo[marca_vehiculo] IN {"TOYOTA", "HONDA"}))
Va de nuevo por que el editor me fallo
les dejo mi formula,
Con esto evitaran que el total salga incorrecto.
Gracias por el aporte
Este es el correcto, por que otros usan SUM y sale bien pero la sumatoria no es la correcta, solo deberia sumarse en la tabla los valores filtrados
Yo lo hice de esta manera:
VentasVeh > 50000000 = CALCULATE([Total de Ventas],
FILTER(GROUPBY(dim_vehiculo,dim_vehiculo[marca_vehiculo])
,[Total de Ventas]>50000000))
```Aunque no entiendo por qué el filter cuando se realiza con la medida Total de Ventas que sean mayores a 50M genera una tabla vacía, al parecer la agregación no cumple con el criterio y pienso que pueda ser que se sume por id vehículo y no por Marca, tal vez por eso no alcanza los 50M.![]()
Muy bueno tu aporte, llegas a la solución utilizando solo herramientas que hemos aprendido aca 👏🏻
En el caso de la medida del total de vetas de Honda y Toyota, para que se aplique el filtro en el contexto se debe utilizar la función filter:
TOTAL DE VENTA HONDA - TOYOTA = CALCULATE([Total de Ventas], FILTER(dim_vehiculo,dim_vehiculo[marca_vehiculo] IN {"TOYOTA","HONDA"}))
Tienes toda la razon además hay que fijarse en utilizar marca_vehiculo de la tabla dim_vehiculo y no de Marca_TOP
Declara Honda (min2:41) y sale Suzuki (min 3:10)
Los valores son los mismos para cualquier marca, cuando lo ideal seria ver un ejercicio donde mostrara los valores de cada marca.
Para que otros compañeros lo consideren no vaya a ser que lo pasen por alto, saludos
Ventas > 50M = CALCULATE([Total de Ventas], FILTER(VALUES(dim_vehiculo[marca_vehiculo]), [Total de Ventas]>50000000))
Yo por aqui nuevamente, me estoy dando cuenta que algo pasa con mi tabla dim_vehiculo que no esta funcionando las medidas, se puede ver no trae ningun valor
Hola Karina ya te dio la medida presento la misma novedad no trae ningún valor y por lógica creo que la medida esta correcta...pero el tema es porq no trae los valores.
Si tienes la solución te agradecería para mirar en q estoy fallando
Marca Vehiculo >50000000 =
CALCULATE( [Total de ventas],
FILTER(dim_vehiculo,
[Total de ventas]>50000000))
Gracias.
No funciona como la medidad creada para los vendedores dado que en la columna marca_vehiculo hay valores duplicados, mientras que la columna vendedor tiene valores unicos, para dejar valores unicos por marca y quitar los duplicados hay que usar VALUES:
Venta Marca > 50 Mill = CALCULATE([Total de Ventas],FILTER(VALUES(dim_vehiculo[marca_vehiculo]), [Total de Ventas] > 50000000))
Esta evaluacion de contextos va mas allá del uso de calculate, la idea es que tu puedas entender que filas, que datos son relevantes para tu caso, ademas, como una funcion puede relacionarse con los datos.
es una parte crucial en el analisis de los datos ya que te va a permitir responder preguntas claves de negocio.
Para este ejercicio me topé con algo interesante relacionado con la granularidad de la información. En el ejercicio se nos mostró esta medida:
VentaVendedor > 3Milloones =
CALCULATE([Total de Ventas],
FILTER(Dim_Vendedor,[Total de Ventas] > 30000000))
Y luego se nos solicitó que crearamos una medida para cuando la marca supera los 50 millones. Lo interesante es que la tabla Dim_Vehiculo, donde se encuentran las marcas, no están en un contexto fila a fila, ya que una marca le pertenece a distintos vehículos, así que al intentar evaluar la medida
MarcaVehiculo > 50M =
CALCULATE([Total de Ventas],
FILTER(dim_vehiculo, [Total de Ventas] > 50000000))
El resultado da blanco. Al investigar un poco se sugiere utilizar como extra la función VALUE() De esta forma en vez de filtrar toda la tabla, filtramos solo la columna marca, haciendo lo siguiente:
MarcaVehiculo > 50M =
CALCULATE([Total de Ventas],
FILTER(VALUES(dim_vehiculo[marca_vehiculo]), [Total de Ventas] > 50000000))
En el contexto de "Filtros por medida" la función FILTER requiere una tabla de entrada con valores únicos (no repetidos). Por esa razón, muchos compañeros utilizan la función VALUES para generar una tabla de entrada con valores únicos. Recordemos que nuestra tabla de "dim_vendedor" es un catálogo único de vendedores, caso contrario de nuestra tabla "dim_vehiculo" la cual es un catálogo único de modelos más no de marcas. Por ello, una solución es la siguiente: VENTAS_X_MARCA>50M = CALCULATE([Total de Ventas],FILTER(VALUES(dim_vehiculo[marca_vehiculo]),[Total de Ventas]>50000000))
Muchas gracias por esta aclaración.
Para la tarea que encarga al final, me funcionó con
Marca Vehiculo Venta>50M = CALCULATE([Total de ventas],FILTER(VALUES(dim_vehiculo[marca_vehiculo]),[Total de ventas]>50000000))
pues a diferencia de la tabla vendedor, dim_vehiculo tiene filas con marcas de vehiculos duplicadas (vendedor no, porque es una fila por vendedor).
Entonces al usar VALUES(dim_vehiculo[marca_vehiculo]) estamos agrupando por marca y asi tener una fila unica. De esta manera recien podemos filtrar por marcas sobre los 50.000.000
Apliqué la siguiente formula, incluyendo el VALUES:
VentaVehiculo>50 Milloes =
CALCULATE([Total de Ventas], FILTER(VALUES(dim_vehiculo[marca_vehiculo]),[Total de Ventas]>50000000))
¿Por qué aparece Suzuki?
El profe Renzo, agarró MARCA_VEHICULO de la tabla MARCA_TOP.