1. Faro

Nivel 3 · Un margen ponderado con SUMX y RELATED

La solicitud

De Monica Reyes, Planificadora de mercancía

“Necesito el margen bruto % por categoría para la revisión del surtido, ponderado por lo que realmente vendimos. Ojo: nueve productos todavía no tienen costo unitario en el catálogo. Si cuentan como gratis, Furniture parece un negocio con un margen del 70 %, y no lo es.”

Tu objetivo

La matriz tiene products[category] en las filas; una segmentación deja los pedidos completados. Crea una medida llamada Margin %: (ingresos − costo) / ingresos, donde los ingresos son order_items[line_total] y el costo es order_items[quantity] × el unit_cost del producto. Deja fuera, tanto de los ingresos como del costo, toda línea de pedido cuyo producto tenga unit_cost vacío. Se pueden usar medidas auxiliares; se comprueba la última.

  • Llena [Margin %] en cada fila del visualpendiente
  • También la fila Total correctapendiente

Tu medida

DAX
Visual
A matrix: rows = products[category]; values = [Margin %]
Segmentaciones
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[Margin %] fills in when you press Check
    El visual antes de tu respuesta
    categoryMargin %
    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.

    La lección

    Un margen % es una razón entre dos sumas, y ambas sumas tienen que salir de las mismas filas. El catálogo de Monica tiene un hueco, así que el verdadero trabajo de este ticket es decidir qué hacer con las filas que caen por ese hueco.

    Dónde estás trabajando

    La matriz de abajo es un informe de práctica creado para este sitio; Power BI Desktop solo funciona en Windows. Un motor DAX evalúa tus medidas en cada celda siguiendo las reglas de Power BI. Para hacerlo de verdad: Inicio → Nueva medida (Home → New measure) para cada una de las medidas y luego Herramientas de medida → Formato → Porcentaje (Measure tools → Format → Percentage) en Margin % para que 0.534 se muestre como 53.4 %.

    El costo por línea es cantidad × costo unitario, pero los dos números viven en tablas distintas. Dentro de un iterador sobre order_items, RELATED(products[unit_cost]) sigue la relación desde la línea actual hasta su único producto y devuelve el costo de ese producto:

    Cost =
    SUMX(
        order_items,
        order_items[quantity] * RELATED(products[unit_cost])
    )

    RELATED funciona del lado de muchos al lado de uno (línea → producto). La dirección contraria, de un producto a sus muchas líneas, es RELATEDTABLE.

    Ponderado, no promediado

    DIVIDE(ingresos − costo, ingresos) sobre las líneas de la celda es un margen ponderado: un producto que vendió $200,000 lo mueve mucho más que uno que vendió $2,000. La alternativa, AVERAGEX(order_items, <margen % de la línea>), da un voto a cada línea, así que un accesorio barato cuenta tanto como un sofá. Cuando los gerentes dicen “nuestro margen”, se refieren al número ponderado.

    Decidir qué significan los costos vacíos

    Nueve productos no tienen unit_cost. En una operación aritmética, DAX trata el vacío como cero, así que las líneas de esos productos suman ingresos pero ningún costo: 100 % de margen. Así es como Furniture llega al 70 %.

    Tienes tres opciones honestas: conseguir los costos, estimarlos y decirlo, o dejar esas líneas fuera de ambas sumas. Esto último es lo que pidió Monica:

    Costed Revenue =
    SUMX(
        FILTER(order_items, NOT ISBLANK(RELATED(products[unit_cost]))),
        order_items[line_total]
    )

    Usa el mismo FILTER en la medida Cost y luego:

    Margin % = DIVIDE([Costed Revenue] - [Cost], [Costed Revenue])

    Dejarlas fuera solo del lado del costo es el error que hay que evitar: entonces los productos sin costo siguen contando en los ingresos e inflan el margen.

    Medidas que llaman a medidas

    Dividir la lógica en Costed Revenue, Cost y Margin % mantiene cada pieza corta y comprobable: pon Cost en la matriz por sí sola y revísala antes de dividir. En este editor, escribe las tres; se comprueba la última.

    Errores comunes

    • Tratar el vacío como costo cero. Decide qué significan los vacíos antes de dividir.
    • Promediar porcentajes. Pondera por ventas: razón de sumas, no promedio de razones.
    • RELATED fuera de un iterador. Necesita una fila actual; en una medida simple no hay ninguna.

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