1. Faro

Nivel 7 · Calcúlalo una vez con VAR

La solicitud

De Laura Chen, Analista de precios

“Escribí una medida Discount Share: cuánto del valor de lista de los pedidos completados regalamos en descuentos. Es correcta, pero pide Gross Sales tres veces por celda y nuestro contratista lo señaló. ¿Puedes reescribirla para que cada medida se calcule una vez?”

Tu objetivo

El informe tiene Sales (neto, pedidos completados) y Gross Sales (quantity × unit_price de lista, pedidos completados). La versión de Laura está en el editor como comentario. Escribe Discount Share = (Gross Sales − Sales) ÷ Gross Sales, vacío cuando Gross Sales no sea mayor que cero, guardando Gross Sales y Sales en variables para que cada una se evalúe una vez.

  • Llena [Discount Share] en cada fila del visualpendiente
  • También la fila Total correctapendiente

Tu medida

DAX
Visual
A matrix: rows = products[category]; values = [Gross Sales], [Sales], [Discount Share]
Medidas del informe
Sales = CALCULATE(SUM(order_items[line_total]), orders[status] = "completed")Gross Sales = CALCULATE(SUMX(order_items, order_items[quantity] * order_items[unit_price]), orders[status] = "completed")
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…

    Visual[Discount Share] fills in when you press Check
    El visual antes de tu respuesta
    categoryGross SalesSalesDiscount Share
    Decor839,177.12822,667.2
    Furniture1,421,9451,393,163.85
    Kitchen817,460.81799,150.28
    Lighting1,021,049.991,001,843.51
    Outdoor1,324,874.491,297,801.77
    Textiles591,561.12579,657.83
    Total6,016,068.535,894,284.44

    Mote revisa tu resultado

    Presiona Comprobar. Mote completa tu respuesta y la compara con lo que necesita el informe.

    La lección

    La medida de Laura es correcta, y hace el mismo trabajo tres veces. En una matriz con seis categorías y un Total, son 21 evaluaciones de Gross Sales donde bastarían 7. En una página con una docena de medidas así y millones de filas, se acumula.

    Dónde estás trabajando

    Esta página es un informe de práctica, no Power BI: una matriz de categorías con Gross Sales, Sales y tu medida. El motor evalúa tu medida en cada celda y compara cada una con el valor esperado; comprueba los números, así que las variables quedan a tu elección. En Power BI Desktop: selecciona la medida en el panel Datos (Data) y edítala en la barra de fórmulas; Shift+Enter añade una línea nueva.

    VAR y RETURN

    Discount Share =
    VAR gross = [Gross Sales]
    VAR net = [Sales]
    RETURN IF(gross > 0, DIVIDE(gross - net, gross))
    • VAR nombre = expresión evalúa la expresión una vez, donde se define, en el contexto de filtro de la celda, y guarda el resultado.
    • Puedes tener tantas VAR como quieras; cada una puede usar las de arriba.
    • RETURN cierra la lista y da el resultado de la medida, construido a partir de las variables.

    Los nombres de las variables son tuyos. No pueden contener espacios ni chocar con el nombre de una tabla, y los nombres cortos y simples (gross, net, share) se leen mejor.

    Más rápido, y más fácil de leer

    El motor de Power BI a veces se da cuenta de que la misma medida aparece dos veces y reutiliza el resultado, pero no siempre, sobre todo cuando hay filtros o iteradores. Una variable lo garantiza. La ventaja mayor suele ser la legibilidad: cada línea nombra un paso, así que la siguiente persona (o tú, dentro de seis meses) puede ver qué hace la medida, y puedes depurarla devolviendo una sola variable: RETURN gross muestra lo que da ese paso en cada celda.

    Las variables quedan fijas una vez establecidas

    Una variable es un valor, no una fórmula. Aquí es lo que quieres. Sorprende a la gente cuando CALCULATE viene después:

    Web Share =
    VAR total = [Sales]
    RETURN DIVIDE(CALCULATE(total, orders[channel] = "web"), total)

    Esto devuelve 100 % en todas partes: total ya se había calculado antes de que CALCULATE cambiara el filtro. Pon la medida, no la variable, dentro de CALCULATE: CALCULATE([Sales], orders[channel] = "web").

    DIVIDE en lugar de /

    DIVIDE(a, b) devuelve un vacío cuando b es cero o está vacío, en lugar de un error o infinito. Aquí el IF ya lo protege, pero DIVIDE es el hábito que conviene mantener: tiene además un tercer argumento opcional para lo que devolver en lugar de un vacío.

    Errores comunes

    • Una variable dentro de CALCULATE esperando que cambie con el nuevo filtro.
    • Olvidar RETURN. Una medida con VAR debe terminar con RETURN y una expresión.
    • Espacios en los nombres de variable. VAR gross sales no se interpreta; usa gross o gross_sales.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.