La solicitud

De Victor Ramirez, Director de marketing
Tu objetivo
La medida antigua está en el editor como comentario. Escribe una nueva medida Web Sales que devuelva los mismos números (pedidos web completados, suma de order_items[line_total]) en cada celda de la matriz de categorías, usando CALCULATE con filtros de columna y sin la función FILTER.
- Llena
[Web Sales]en cada fila del visualpendiente - También la fila Total correctapendiente
Tu medida
- Visual
- A matrix: rows = products[category]; values = [Web Sales]
Panel de datos: tablas y columnas
- order_items order_item_id, order_id, product_id, quantity, unit_price, discount_pct, line_total
- orders order_id, customer_id, order_date, status, channel, shipping_fee, coupon_code
- products product_id, name, category, subcategory, unit_price, unit_cost, launched_on, is_active
- customers customer_id, first_name, last_name, email, city, state, signup_date, segment, referral_source
- returns return_id, order_item_id, returned_on, reason, refund_amount
- Date Date, Year, Quarter, Month Number, Month, Year Month, Year Quarter, Day, Weekday Number, Weekday
Cargando el editor…
Solución de referencia
| category | Web Sales |
|---|---|
| Decor | |
| Furniture | |
| Kitchen | |
| Lighting | |
| Outdoor | |
| Textiles | |
| Total |
Mote revisa tu resultado
Presiona Comprobar. Mote completa tu respuesta y la compara con lo que necesita el informe.
Lo que recibe Victor, y por qué
La lección
La medida de Victor devuelve los números correctos. Por eso mismo sobreviven las medidas lentas: nadie las mira hasta que una página tarda diez segundos en responder a un clic.
Dónde estás trabajando
Esta página es un informe de práctica, no Power BI: una matriz con products[category] en las filas y un
editor de DAX. Cuando pulsas Comprobar (Check), el motor evalúa tu medida en cada celda, compara cada
una con los números esperados y comprueba también que FILTER ya no esté, porque la velocidad es el
sentido del ticket. No puede cronometrar tu fórmula como lo hace Power BI.
En Power BI Desktop, selecciona la medida en el panel Datos (Data), edítala en la barra de fórmulas y pulsa Enter. Luego Optimizar → Analizador de rendimiento → Iniciar grabación → Actualizar objetos visuales (Optimize → Performance analyzer → Start recording → Refresh visuals) y compara el tiempo de la consulta DAX antes y después.
Qué hace la versión lenta
Web Sales = SUMX(
FILTER(order_items, RELATED(orders[channel]) = "web" && RELATED(orders[status]) = "completed"),
order_items[line_total])
FILTER recorre cada fila de order_items visible en la celda, sigue la relación hacia orders dos
veces por fila con RELATED y construye una nueva tabla con las filas que pasan. SUMX recorre después
esa tabla. Casi todo es trabajo fila por fila para el motor de fórmulas de un solo hilo, y crece con la
tabla de hechos.
Qué hace la versión rápida
Web Sales = CALCULATE(
SUM(order_items[line_total]),
orders[channel] = "web",
orders[status] = "completed")
Cada condición es un filtro de columna: CALCULATE convierte orders[channel] = "web" en “la columna
channel, valor web”. Los filtros sobre orders llegan a order_items por la relación, igual que una
segmentación. Lo que queda es una simple SUM sobre una columna filtrada, que el motor de almacenamiento
hace en un solo recorrido rápido. Dos argumentos de filtro se combinan con AND.
Mismos números, cada celda
Las filas de la matriz filtran products, que filtra order_items; los nuevos filtros sobre orders se
suman a eso. Así cada fila de categoría obtiene sus ventas web completadas, y la fila Total obtiene todas.
Un filtro de columna de CALCULATE reemplaza un filtro existente sobre la misma columna, así que si la
página tuviera una segmentación de canal, esta medida la ignoraría y mostraría siempre web. Eso es lo que
pidió Victor.
Cuándo FILTER es la herramienta correcta
Conserva FILTER cuando la condición no se pueda escribir como una prueba sobre una columna: comparar dos
columnas (order_items[unit_price] > RELATED(products[unit_price])) o probar una medida. Incluso
entonces, filtra la tabla más pequeña que sirva, como FILTER(VALUES(orders[order_id]), …), nunca toda la
tabla de hechos.
Errores comunes
- Quitar la prueba de estado. Se cuelan pedidos web cancelados y reembolsados.
FILTER(ALL(orders), …)dentro de CALCULATE. Quita también los filtros de segmentación sobre orders.- Comillas alrededor de los nombres de columna.
"orders[channel]"es texto, no una columna.
¡Linterna encendida!
Practicaste: performancecalculatefiltersumxstorage enginecolumn filters
- Resuelto
- Sin pistas
- Al primer intento
