Forum Discussion
Calcular datos que cumplan con dos condiciones
Hola!
Os hago una breve explicación. Tengo tres tablas: una de albaranes (fact_stock_picking), una de líneas de albarán (fact_stock_move) y otra de estado de las albaranes y sus líneas (dim_picking_status), todas ellas relacionadas por su ID.
Los estados de albarán y de las líneas de albarán pueden ser realizado (1), abierto (2) o cancelado (3). (Los números hacen referencia a la ID).
Quiero el número de datos que cumplan con las siguientes dos condiciones a la vez:
- Que el estado de albarán sea "realizado" (dim_picking_status[picking_status_id]=1).
- Cumpliendo con la condición 1, calcular cuántas líneas de albarán tienen otro estado distitno a "realizado": dim_picking_status [picking_status_id] in 2,3.
Esto es lo que he intentado; sin embargo, en la segunda variable, no me reconoce la primera condición del IF y solo estaría calculando la segunda parte. Por tanto solo obtengo los datos que cumplen con la condición 2.
albaranes_realizado_con_lineas_otro =
VAR albaranes_realizado =
CALCULATE(
DISTINCTCOUNT(fact_stock_picking[stock_picking_id]),
dim_picking_status[picking_status_id] = 1,
fact_stock_move[picking_date_id]>=20220501
)
VAR albaranes_realizado_con_lineas_en_otro_estado =
IF(albaranes_realizado,
CALCULATE(
DISTINCTCOUNT(fact_stock_move[stock_move_id]),
dim_picking_status[picking_status_id] in {2,3},
fact_stock_move[picking_date_id]>=20220501
)
)
RETURN albaranes_realizado_con_lineas_en_otro_estado
Muchas gracias!
Prueba con la siguiente medida:
albaranes_realizado_con_lineas_otro = VAR _S1 = CALCULATETABLE ( VALUES ( 'fStock move'[stock_picking_id] ), FILTER ( ALL ( 'fStock move' ), 'fStock move'[picking_status] = 1 ) ) VAR _SOthers = CALCULATETABLE ( VALUES ( 'fStock move'[stock_picking_id] ), FILTER ( ALL ( 'fStock move' ), 'fStock move'[picking_status] <> 1 ) ) VAR _Cross = INTERSECT ( _SOthers, _S1 ) VAR _Other = COUNTROWS ( FILTER ( 'fStock move', 'fStock move'[picking_status] <> 1 ) ) RETURN IF ( AND ( MAX ( 'fStock move'[stock_picking_id] ) IN _Cross, _Other = 1 ), 1 )
3 Replies
- PaulDBrownCommunity Champion
En la segunda VAR, pon IF(albaranes_realizado =1,......
Sino funciona, puedes por favor compartir una muestra de datos de las 3 tablas (que no contengan información confidencial) o un enlace a un archivo PBIX (no confidencial)?
- powerbi2srmResolver II
Aquí tienes un ejemplo:
Tabla 1: fact_stock_picking
stock_picking_id picking_status_id 101 1 102 1 103 1 104 1 105 1 Tabla 2: fact_stock_move
stock_move_id stock_picking_id picking_status 1021 101 1 1022 101 1 1023 101 2 1024 102 1 1025 102 3 Tabla 3: dim_picking_status
picking_status_id picking_status 1 Done 2 Open 3 Cancel Quiero, por tanto, una fórmula que hiciese un recuento que cumpliera con las dos condiciones enunciadas. En este ejemplo, serían stock_picking_id = 101 y stock_picking_id = 102, puesto que tienen líneas de albarán (stock_move_id) en otro estado: 1023 y 1025.
Muchas gracias!
- PaulDBrownCommunity Champion
Prueba con la siguiente medida:
albaranes_realizado_con_lineas_otro = VAR _S1 = CALCULATETABLE ( VALUES ( 'fStock move'[stock_picking_id] ), FILTER ( ALL ( 'fStock move' ), 'fStock move'[picking_status] = 1 ) ) VAR _SOthers = CALCULATETABLE ( VALUES ( 'fStock move'[stock_picking_id] ), FILTER ( ALL ( 'fStock move' ), 'fStock move'[picking_status] <> 1 ) ) VAR _Cross = INTERSECT ( _SOthers, _S1 ) VAR _Other = COUNTROWS ( FILTER ( 'fStock move', 'fStock move'[picking_status] <> 1 ) ) RETURN IF ( AND ( MAX ( 'fStock move'[stock_picking_id] ) IN _Cross, _Other = 1 ), 1 )