Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.

Reply
Syndicate_Admin
Administrator
Administrator

Optimización y corrección de medidas de DAX: promedio de SKU por factura: Filter/RelatedTable/DistinctCount

¡Hola a todos! En primer lugar, muchas gracias por tomarse el tiempo de leer esta pregunta, se trata tanto de la optimización como de la corrección de la medida del DAX.

1. Tengo un modelo de datos que consta de dos tablas, dimCustomer y factSales. En realidad, dimCustomer tiene alrededor de 800 mil filas y factSales alrededor de 60 millones de filas. Se parece a esto
sample_model_1.png

si nos fijamos bien en la tabla dimCustomer, podemos ver que para cada customer_code, puede que tenga varios customer_ids, esto se debe a que un customer_id se basa en las diferentes combinaciones de customer_code y customer_name, pero en mi empresa nos centramos en customer_code.

sample_model_2.png

Para la tabla factSales, es información transaccional de facturas y devoluciones. Algunas facturas pueden tener varias líneas para el mismo SKU (celdas moradas), esto se debe a que fue un regalo o un precio diferente para una cierta cantidad de artículos, simplemente sucede. (No puedo agrupar mi tabla de hechos para que solo haya una fila por SKU dentro de cada factura)

El KPI que estoy tratando de obtener es el SKU promedio por factura. Tenemos dos reglas de negocio en mi empresa: invoice_type = "FACTURA" y customer_code suma total de ventas >0, esto quiere decir que si una suma customer_code de ventas es 0 o inferior por devoluciones en un determinado periodo de tiempo, no quiero tenerlo en cuenta, ni contar los SKU que devolvió.

El cálculo sería la SUMA de DISTINTAS SKU dentro de cada factura, dividida por distintos recuentos de facturas, (sin dejar de lado las dos reglas de negocio)

Las facturas distintas que tengo, mi problema es con la parte de 'Suma de SKU distintos dentro de cada factura'.

(Adjunto un libro de trabajo de muestra con los datos de las imágenes y las medidas cargadas).

Ya tengo una medida que funciona, pero con todo el conjunto de datos no está funcionando bien, incluso muestra un error de no tener suficientes recursos para calcular el tipo de medida.

Esta es la medida de trabajo (lenta con todo el conjunto de datos):
Mi idea es,
1. vTable0 = filtra la tabla de hechos con los 4 campos que necesito, solo invoice_type = "FACTURA" (Parte que supongo que es la que más recursos consume)

2. vTable_1 = obtener una lista de customer_code donde la suma de las ventas >0
3. vTable_2 = filtrar vTable0 en función de la customer_code presente en vTable_1

4. Cuente las filas de vTable_2 resultantes

Measure_Working_But_Slow = 

VAR vTable_0 =
    FILTER(
        SUMMARIZE(
            factSales,
            dimCustomer[customer_code],
            factSales[invoice_number],
            factSales[invoice_type],
            factSales[SKU]),
        factSales[invoice_type]="INVOICE"
    )

VAR vTable_1 =
    FILTER(
        SUMMARIZE(
            dimCustomer,
            dimCustomer[customer_code]
        ),
    CALCULATE(SUM(factSales[row_value]))>0
    )

VAR vTable_2 =
    FILTER(
        vTable_0,
        dimCustomer[customer_code] IN vTable_1
    )

RETURN
    COUNTROWS(vTable_2)

Esta es la medida No funciona (muy cerca del resultado y rápida)

Obtuve esta idea del video de youtube relacionado con SQLBI que funciona a las mil maravillas. Esta es la idea

1. Filtra customer_code en función de la suma de las ventas > 0

2. SUMX de las filas de conteo de la tabla relacionada donde invoice_type = "FACTURA"

El error es que como en una misma factura podemos tener dos filas con el mismo SKU, esas dos se cuentan, pero necesito contar solo una fila por SKU único dentro de cada factura. Entonces, si la factura tiene este fenómeno, el resultado no será el correcto.

Measure_Not_Working = 

VAR vTable_0 = 
    FILTER(
        VALUES(dimCustomer[customer_code]),
        CALCULATE(SUM(factSales[row_value])) > 0
    )

VAR vTable_1 = 
    SUMX(
        vTable_0,
        COUNTROWS(
            FILTER(
                RELATEDTABLE(factSales),
                factSales[invoice_type] = "INVOICE"
            )
        )
    )

RETURN vTable_1

Esta es la lógica que tiene que seguir la medida para dar el resultado correcto. Solo para los códigos de cliente que tienen una suma total de ventas superior a 0 y para las facturas cuyo tipo es "FACTURA", contamos los SKU distintos dentro de la factura.

Además, la medida también tiene que funcionar en un gráfico de líneas. No solo en tarjeta. (hice algunos experimentos con summarizecolumns que no funcionaron para gráficos de líneas)

sample_model_3.png



Me he preguntado por todas partes si hay alguna manera de filtrar esa tabla relacionada antes de pasarla a las filas de conteo ... Eso sería algo bueno, pero no he sido capaz de encontrar una manera.

Gracias de nuevo por tomarse el tiempo.!!

PD: Acabo de ver que no puedo adjuntar el archivo pbix directamente ya que soy un poco nuevo en la comunidad.
Enlace de WeTransfer para descargar el archivo pbix o el archivo xlsx con tablas

Transferimos Enlace (https://we.tl/t-lcrrUEigxJ)

o tablas aquí:

customer_idcustomer_codecustomer_name

1C_001Tienda de Tenis - Miami
2C_001Tienda de Tenis - Orlando
3C_002Tienda de camisas - Dallas
4C_002Tienda de camisas - Nueva York
5C_002Tienda de camisas - Tampa
6C_003Tienda de surf

invoice_datecustomer_idinvoice_numberinvoice_typeSKUrow_value

1/01/20231INV_001FACTURA1001100
1/01/20231INV_001FACTURA1002200
1/01/20231INV_001FACTURA1003300
1/01/20231INV_001FACTURA1003100
2/01/20232INV_002FACTURA1001200
2/01/20232INV_002FACTURA1002300
2/01/20232INV_002FACTURA1003100
3/01/20233INV_003FACTURA1001200
3/01/20233INV_003FACTURA1002300
3/01/20233INV_003FACTURA1003100
3/01/20233INV_003FACTURA1004200
3/01/20233INV_003FACTURA1004300
4/01/20234RET_001DEVOLUCIÓN1001-100
4/01/20234RET_001DEVOLUCIÓN1002-200
5/01/20236INV_004FACTURA1001100
6/01/20236RET_002DEVOLUCIÓN1001-100

4 REPLIES 4
Syndicate_Admin
Administrator
Administrator

¡¡Gracias!! Seguiré trabajando en ello por mi parte y publicaré si algo cambia.

Syndicate_Admin
Administrator
Administrator

@SimonVallejoV

Si se me ocurre algo más, te lo haré saber. Voy a ver el hilo porque me gustaría saber qué otras ideas pueden surgir.

Buena suerte

Syndicate_Admin
Administrator
Administrator

¡Gracias por la idea! Desafortunadamente, intenté eliminar dimCustomer de dimCustomer[customer_code] en vTable_2 y factSales de factSales[invoice_type] en vTable_0 pero el rendimiento es básicamente el mismo, para un filtro aplicado en muchas filas, este es el resultado.
con nombre de tabla = 37588 ms
vs

sin el nombre de la tabla 36548 ms.

Syndicate_Admin
Administrator
Administrator

@SimonVallejoV

En su medida lenta en la que está definiendo la variable vTable_2, ¿habría alguna diferencia eliminar 'dimCustomer' de 'dimCustomer'[customer_code] ?

No estoy seguro de si marcaría la diferencia, pero tal vez valga la pena intentarlo.

Helpful resources

Announcements
LearnSurvey

Fabric certifications survey

Certification feedback opportunity for the community.

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.