Forum Discussion
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
- Syndicate_Admin
Administrator
@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 vResultAgregue 'ITEMID BOM'[ITEMID] y la segunda medida a un objeto visual:
- Syndicate_Admin
Administrator
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
Administrator
@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!