1. Faro

Nivel 8 · Desafío final: rescata el informe de descuentos lento

La solicitud

De Patrick Owens, Director de operaciones (COO)

“El informe de descuentos es lo más lento que tenemos, y lo necesito para la revisión de precios. Tres arreglos, por favor: la medida Discounted Sales, una medida de participación sobre las ventas encima de ella que no se repita, y la importación de líneas de pedido, que carga mucho más de lo que usa el informe.”

Tu objetivo

Paso 1 de 3. Paso 1. La antigua Discounted Sales está en el editor como comentario. Escribe de nuevo Discounted Sales con los mismos números (pedidos completados, líneas con discount_pct mayor que 0, suma de order_items[line_total]) usando CALCULATE con filtros de columna y sin FILTER. La matriz tiene 'Date'[Year] en las filas.

  • Llena [Discounted Sales] en cada fila del visualpendiente
  • También la fila Total correctapendiente

Paso 1 · tu medida

DAX
Visual
A matrix: rows = 'Date'[Year]; values = [Sales], [Discounted Sales]
Medidas del informe
Sales = CALCULATE(SUM(order_items[line_total]), 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[Discounted Sales] fills in when you press Check
    El visual antes de tu respuesta
    YearSalesDiscounted Sales
    2,0231,600,510.52
    2,0241,993,604.39
    2,0252,300,169.53
    Total5,894,284.44

    Mote revisa tu resultado

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

    Paso 2 · tu medida

    DAX
    Visual
    A matrix: rows = 'Date'[Year]; values = [Sales], [Discounted Share]
    Medidas del informe
    Sales = CALCULATE(SUM(order_items[line_total]), 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[Discounted Share] fills in when you press Check
      El visual antes de tu respuesta
      YearSalesDiscounted Share
      2,0231,600,510.52
      2,0241,993,604.39
      2,0252,300,169.53
      Total5,894,284.44

      Mote revisa tu resultado

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

      Paso 3 · tus pasos de consulta

      Power Query
      La hoja de este nivel
      order_item_idorder_idproduct_idquantityunit_pricediscount_pctstatuschannel
      1289181244813561590completedapp
      2289191244812931090completedapp
      32892012448180220.990completedapp
      4289211244815531690completedapp
      52892212449185112.9910completedweb
      62892312449186120.9910completedweb
      72892412449198-144.9910completedweb
      82892512449136115910completedweb
      92892612450185112.990completedweb
      102892712451166128.990completedmarketplace
      112892812451115215990completedmarketplace
      122892912452118116090completedmarketplace
      132893012452166128.990completedmarketplace
      142893112453121331.9920completedapp
      152893212454160170.990completedapp
      162893312454156153.990completedapp
      172893412454180120.990completedapp
      18289351245515521690completedapp
      192893612455166228.990completedapp
      202893712456189176.990completedweb
      212893812456198244.990completedweb
      222893912456180120.990completedweb
      232894012456193119.990completedweb
      242894112457152213.990completedmarketplace
      252894212457142138.990completedmarketplace
      262894312457128154.990completedmarketplace
      272894412458193119.990completedapp
      282894512458146116.990completedapp
      292894612459193119.990completedweb
      30289471246017321390completedweb
      312894812460171327.990completedweb
      32289491246013821990completedweb
      332895012461171127.9920completedmarketplace
      342895112462151160.9920completedapp
      352895212462166128.9920completedapp
      362895312463141113.990completedweb
      372895412464182217.990completedweb
      382895512464193119.990completedweb
      392895612464122129.990completedweb
      40289571246413811990completedweb
      412895812465151260.9920completedweb
      422895912465158117920completedweb
      432896012465190143.9920completedweb
      4428961124651991104.9920completedweb
      45289621246613014090completedweb
      462896312467165125.9920completedapp
      472896412467157410920completedapp
      48289651246818111790completedweb
      492896612468193319.990completedweb
      502896712468172118.990completedweb
      51289681246914023290completedmarketplace
      52289691246911011790completedmarketplace

      Cargando el editor…

        ResultadoPresiona Comprobar para comparar el resultado de la consulta

        Mote revisa tu resultado

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

        La lección

        El informe de Patrick es lento por las tres razones habituales a la vez: una medida que trabaja fila por fila, una medida que se repite y una importación que lleva mucho más de lo que nadie lee. Este caso arregla las tres, en el orden en que lo harías en el trabajo.

        Dónde estás trabajando

        Un informe de práctica y un editor de Power Query de práctica, no Power BI. Los pasos 1 y 2 son medidas DAX comprobadas celda por celda en una matriz con 'Date'[Year] en las filas; el paso 1 comprueba además que FILTER ya no esté. El paso 3 es una lista de Pasos aplicados (Applied Steps) sobre las líneas de pedido importadas, comprobada contra la tabla esperada.

        En Power BI Desktop: antes de empezar, Optimizar → Analizador de rendimiento → Iniciar grabación → Actualizar objetos visuales (Optimize → Performance analyzer → Start recording → Refresh visuals) y anota los tiempos de la consulta DAX. Edita las medidas en la barra de fórmulas, abre la consulta con Inicio → Transformar datos (Home → Transform data) y vuelve a grabar al final.

        Paso 1: de FILTER a filtros de columna

        La medida antigua recorre cada línea de pedido, busca el estado del pedido con RELATED, conserva las líneas completadas con descuento y luego las suma. Ambas condiciones son pruebas sencillas sobre una columna cada una, que es exactamente para lo que sirven los argumentos de filtro de CALCULATE:

        Discounted Sales = CALCULATE(SUM(order_items[line_total]),
            order_items[discount_pct] > 0, orders[status] = "completed")

        El filtro de estado sobre orders llega a order_items por la relación, y el año de las filas de la matriz le llega por 'Date' → orders. Mismos números, un solo recorrido del motor de almacenamiento.

        Paso 2: una participación sin repeticiones

        Discounted Share =
        VAR discounted = [Discounted Sales]
        VAR total = [Sales]
        RETURN IF(total > 0, DIVIDE(discounted, total))

        Cada medida se evalúa una vez por celda y se reutiliza. DIVIDE protege la fila Total y cualquier año sin ventas. Dale formato de porcentaje en Power BI con Herramientas de medida → Formato → Porcentaje (Measure tools → Format → Percentage).

        Paso 3: importar solo las líneas con descuento

        El origen trae ocho columnas por cada línea del día. El informe necesita cuatro, y solo de las líneas con descuento:

        Filter rows: discount_pct > 0
        Choose columns: order_id, product_id, quantity, discount_pct

        Ambos pasos se pliegan en la consulta SQL que envía Power Query, así que SQL Server devuelve el pequeño resultado y Power BI nunca almacena el resto. Filtra primero: una vez elegidas las cuatro columnas, el filtro aquí sigue funcionando, pero en informes reales la columna por la que filtras suele ser una que descartas.

        Qué comprobar después

        Vuelve a grabar con el Analizador de rendimiento. El tiempo de la consulta DAX de los visuales de descuentos debería bajar, la actualización debería ser más corta y el modelo más pequeño (View Metrics de DAX Studio muestra el tamaño de cada tabla). Si un visual sigue lento, su medida es la siguiente en la lista.

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