Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
3 years ago

SUMX con 2 variables

Querida comunidad,

Ya he publicado esto una vez, pero no recibí ninguna respuesta después de compartir mi conjunto de datos, así que lo estoy intentando de nuevo.

Actualmente estoy luchando con un cálculo de DAX. He creado la siguiente medida de DAX:

Total Trans QTY LTM =

VAR _Date = MAX('Fecha'[Fecha])

VAR _Startdate = FECHA(AÑO(_Date)-1; MES(_Date);D AY(_Date))

VAR _BOMitem = IF(selectedvalue('itemid BOM'[Versión BOM. BOMID])="En blanco";1;0)

VAR _Workorder = FIND(SELECTEDVALUE('INVENTTRANS OUT MERGED'[REFERENCEID]);" WO";1;0)

VAR _Table = FILTER('INVENTTRANS OUT MERGED';' INVENTTRANS OUT MERGED'[INVENTTRANS. DATEPHYSICAL]>=_Startdate)

Devolución

SUMX(_Table;' INVENTTRANS OUT MERGED'[INVENTTRANS. Cantidad]*-1)

Pero quiero cambiar la parte de devolución. Solo para un poco de contexto, estoy tratando de calcular la rotación de existencias, pero para ciertos artículos ese cálculo debe ser diferente de otros. Por lo tanto, ya escribí 2 variables para clasificar esos requisitos. Lo que quiero al final es:

Cuando la versión BOM. BOMID devuelve 1 Quiero mantener el mismo resultado que ahora presentado, así que INVENTTRANS. Cantidad *-1 en el _Table filtrado. Pero cuando la versión BOM. BOMID devuelve 0 (así que no en blanco) Quiero el INVENTTRANS. QTY a filtrar, porque no quiero incluir la cantidad que tiene "WO" en el REFERENCEID. Por lo tanto, ya puse el requisito de identificar "WO", pero después de eso estoy perdido. He intentado hacerlo con una instrucción IF, pero debido a que estoy tratando de combinar 2 cálculos en 1, no tengo un resultado verdadero o falso necesario. Solo tiene que ser uno u otro.

En primer lugar, la tabla de elementos en la que está registrada la lista de materiales.

ITEMID

BOMID

perro

"En blanco"

gato

B001

A continuación, la tabla en la que se registra la cantidad por referenceid.

ITEMID

REFERENCEID

QTY

perro

WO1

5

perro

WO2

5

perro

IC01

5

perro

IC02

5

perro

SO1

5

perro

SO2

5

gato

WO3

5

gato

WO4

5

gato

IC03

5

gato

IC04

5

gato

SO3

5

gato

SO4

5

Y finalmente, los números que PowerBI debería presentar.

ITEMID

QTY

perro

30

gato

20

Así que solo para resumir, si el bomid no está vacío, quiero incluir todas las cantidades, excepto las que contienen "WO" en el REFERENCEID. Si el bomid está vacío, quiero incluir todas las cantidades, así que también "WO". No me explayé sobre la función maxdate, porque eso ya está haciendo lo que debería hacer.

¡Realmente aprecio la ayuda!

Gr. Diana

4 Replies

  • @DLU,

    Esta solución utiliza el siguiente modelo de datos:

    Medidas:

    Sum QTY = SUM ( 'INVENTTRANS OUT MERGED'[QTY] )
    Total Trans QTY LTM = 
    VAR vTable =
        ADDCOLUMNS (
            'ITEMID BOM',
            "@Qty",
                VAR vBOMID = 'ITEMID BOM'[BOMID]
                RETURN
                    IF (
                        vBOMID = "Blank",
                        [Sum QTY],
                        CALCULATE (
                            [Sum QTY],
                            NOT CONTAINSSTRING ( 'INVENTTRANS OUT MERGED'[REFERENCEID], "WO" )
                        )
                    )
        )
    VAR vResult =
        SUMX ( vTable, [@Qty] )
    RETURN
        vResult

    Agregue 'ITEMID BOM'[ITEMID] y la segunda medida a un objeto visual:

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Muchas gracias por su ayuda DataInsights, estuve realmente atascado en esto durante unas semanas. Espero que no te importe que te pregunte, pero siempre trato de averiguar cómo funciona el DAX para poder usarlo para fines futuros también. ¿Podría explicar qué hace la función "@qty"? No lo había visto antes en otras medidas de DAX ... ¿Cómo sabe PowerBI que necesita usar la columna qty que en realidad se denomina diferente? ¿Y estoy interpretando correctamente que el VAR vBOMID en realidad no es un VAR separado, sino que está dentro del VAR vTable?

      • Syndicate_Admin's avatar
        Syndicate_Admin
        Icon for Administrator rankAdministrator

        @DLU,

        Me alegra saber que funciona. El "@Qty" es en realidad una columna temporal; Puedes nombrarlo como quieras. La variable vBOMID es una variable anidada dentro de la variable vTable. Dado que ADDCOLUMNS es un iterador, vBOMID nos permite obtener el BOMID para cada iteración y calcular la medida [Suma QTY] en el contexto apropiado. Una vez que se ha iterado la tabla, vTable contiene todos los datos necesarios y, a continuación, SUMX itera vTable.

        ¡Espero que esto ayude!