The ultimate Fabric, Power BI, SQL, and AI community-led learning event. Save €200 with code FABCOMM.
Get registeredEnhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.
Espero que alguien pueda ayudarme. Estoy buscando combinar una instrucción IF con SELECTEDVALUE. Encontré un DAX en el foro que esperaba que funcionara para mí, sin embargo, me está dando resultados incorrectos.
Mi gráfico de columnas contiene Provider en el eje x y busco visualizar el promedio de horas por día para varios tipos de tiempo (controlado por una segmentación) en el eje y. Los tipos de tiempo incluyen:
Tiempo de atención indirecta
Hora de cancelación de No Show
Tiempo de actividad de PFHT
Tiempo de desarrollo del programa
Tiempo de renovación de medicamentos recetados
Hora de mensajes seguros
He creado una medida de promedio/día para cada tipo de tiempo enumerado anteriormente. A modo de ejemplo, la medida para el tiempo de atención indirecta es la siguiente:
Tiempo medio de atención indirecta/día = SUMX(FILTER('ADMIN','ADMIN'[Tipo de actividad]="Tiempo de atención indirecta"),'ADMIN'[Tiempo])/
COUNTX (
RESUMIR ( 'ADMIN', 'ADMIN' [ID de empleado], 'ADMIN' [Fecha] ),
'ADMIN'[Fecha]
)
La razón por la que necesitaba crear la medida anterior es porque cuando simplemente intenté agregar la columna Tiempo al eje Y y mostrarla como un Promedio, obtuve un resultado incorrecto. Por ejemplo, para Kyla resultó en un promedio de 1.24. Consulte 'Informe de muestra 1' en el archivo PBIX.
En el caso de Kyla, el promedio debe ser de 1,22 (suma del tiempo de atención indirecta = 52,25 horas / 43 días = 1,22).
Si no utilizo la segmentación de tipo de actividad y traza la medida de tiempo promedio de atención indirecta por día (que se muestra arriba) en el eje Y, verá que el resultado es correcto, 1,22 horas/día. Consulte 'Informe de muestra 2' en el archivo PBIX.
Pasando a mi problema real ... el DAX que encontré para combinar la funcionalidad IF y SELECTEDVALUE que pensé que funcionaría es el siguiente:
Tiempo promedio/día =
INTERRUPTOR(
SELECTEDVALUE('ADMIN'[Tipo de actividad]),
"Tiempo de atención indirecta", [Tiempo medio de atención indirecta/día],
"Hora de cancelación de no presentación", [Hora promedio de cancelación de no presentación/día],
"Tiempo de actividad PFHT", [Tiempo medio de actividad PFHT/día],
"Tiempo de desarrollo del programa", [Tiempo promedio de desarrollo del programa/día],
"Tiempo de renovación de Rx", [Tiempo promedio de renovación de Rx/día],
"Hora del mensaje seguro", [Hora media del mensaje seguro/día],
)
Consulte 'Informe de muestra 3' en el archivo PBIX. El resultado del DAX IF + SELECTEDVALUE anterior muestra un promedio/día coherente con si simplemente trazara la columna Tiempo en el eje Y (el mismo resultado que el Informe de muestra 1). En el caso de Kyla, muestra 1,24 en lugar de 1,22.
No entiendo por qué está pasando esto. Estoy usando la misma medida dentro del DAX que en el informe de ejemplo 2 y el resultado en el informe de ejemplo 2 se muestra correctamente.
¿Alguien sabe por qué está sucediendo esto y cómo puedo solucionarlo?
He compartido el archivo PBIX aquí: https://ln5.sync.com/dl/e4b294030/fa8r4fk4-5bfy5k7g-cqpw2uv8-xgjeyb3k
Hola @ahiemstra ,
Eché un vistazo a tu caso. El problema no es el valor seleccionado, el problema es que agregas otro filtro al objeto visual. Para que sea más fácil de entender, solo nos centraremos en Kyla por el momento.
En la hoja "Informe de muestra 2", el único filtro que tiene es sobre "Ejercicio" = 2023/24:
En "Informe de muestra 3", agregas otro filtro al juego, filtrando a "Tipo de actividad" = "Tiempo de atención indirecta":
Esto tiene un impacto en el divisor de la fórmula DAX, para el [Tiempo promedio de atención indirecta/día] esto es:
COUNTX (
SUMMARIZE ( 'ADMIN', 'ADMIN'[Employee ID], 'ADMIN'[Date] ),
'ADMIN'[Date]
)
Se resume por [ID de empleado] y [Fecha]. Ahora, en el Informe 3, tiene un filtro adicional que filtra por "Tiempo de atención indirecta". En su caso, esto es filtrar esta fila:
Esta fila se tendrá en cuenta en el Informe 2, ya que no se establece un filtro explícito en "Tiempo de atención indirecta", sino que se establece en el Informe 3.
Por esa razón entras:
Informe 2: 52,25 / 43 filas = 1,22
Informe 3: 52,25 / 42 filas = 1,24
Esto significa que, en mi opinión, hay que filtrar ambos elementos, el numerador y el denominador por el mismo tipo de actividad.
Además, no se recomienda el enfoque SUMX y COUNTX, ya que son funciones iterativas, que podrían resultar bastante costosas con una gran cantidad de datos. Es un mejor enfoque cambiar el contexto del filtro con CALCULATE.
Mi propuesta sería la siguiente medida:
Avg Indirect Care Time/Day NEW =
-- Sum the Time and filter to "Indirect Care Time"
VAR _SumTime = CALCULATE( SUM( ADMIN[Time]), 'ADMIN'[Activity Type]="Indirect Care Time")
-- Create the virtual table, but filter already to "Indirect Care Time"
VAR _SummarizeEmployeeDate =
SUMMARIZE (
FILTER (ADMIN, ADMIN[Activity Type] = "Indirect Care Time"),
'ADMIN'[Employee ID],
'ADMIN'[Date]
)
-- Count the rows of the filtered table
VAR _AmountDays = COUNTROWS( _SummarizeEmployeeDate )
-- divide both results
VAR _Result = DIVIDE( _SumTime, _AmountDays )
RETURN
-- return result
_Result
Si necesitas ayuda, por favor házmelo saber.
Si respondiera a tu pregunta, me encantaría que pudieras marcar mi publicación como una solución ✔️ y darle un pulgar hacia arriba 👍
Saludos
Denis
Blog: WhatTheFact.bi
Sígueme: twitter.com/DenSelimovic
Hola @selimovd,
La segmentación del año fiscal no es relevante aquí, ya que todos los datos de mi conjunto de datos actual son del año fiscal 2023/24 (debería haber eliminado esa segmentación para no confundir la situación).
Puedo ver lo que estás diciendo. En mi medida de 'Tiempo promedio de atención indirecta/día', la primera parte es 52.25 y la segunda parte 43. Cuando agrego la segmentación de datos Tipo de actividad, la primera parte de la medida sigue siendo 52,25, pero la segunda parte es de 42 días. De ahí la razón por la que el resultado cambia de 1,22 a 1,24.
En realidad, solo estaba tratando de ser eficiente, y en lugar de tener un informe separado para los 6 tipos diferentes de tiempo, todos usando sus respectivas medidas de 'Tiempo ________ promedio / día' (que se calculan correctamente), pensé en crear 1 estructura de informe y dejar que el espectador seleccione el tipo de tiempo que desea visualizar y el gráfico se completaría automáticamente en función de la selección del tipo de actividad. Sin embargo, parece que la cortadora está causando el problema.
Intenté su sugerencia propuesta (o al menos creo que lo hice), sin embargo, todavía obtengo 1.24 en lugar de 1.22.
Creé la medida "Promedio de tiempo de atención indirecta/día NUEVO" que sugirió. A continuación, creé una nueva medida utilizando la pieza SELECTEDVALUE y extrayendo su nueva medida para Indirect Care Time:
Tiempo promedio/día NUEVO =
INTERRUPTOR(
SELECTEDVALUE('ADMIN'[Tipo de actividad]),
"Tiempo de atención indirecta", [Tiempo promedio de atención indirecta/día NUEVO],
"Hora de cancelación de no presentación", [Hora promedio de cancelación de no presentación/día],
"Tiempo de actividad PFHT", [Tiempo medio de actividad PFHT/día],
"Tiempo de desarrollo del programa", [Tiempo promedio de desarrollo del programa/día],
"Tiempo de renovación de Rx", [Tiempo promedio de renovación de Rx/día],
"Hora del mensaje seguro", [Tiempo promedio del mensaje seguro/día]
)
Como se mencionó, esto está resultando en 1.24 para Kyla en lugar de 1.22. ¿Quizás entendí mal tu solución?
Hola @ahiemstra ,
si la medida no funciona, puedes pegarla aquí, puedo echarle un vistazo.
Para el Switch, también puede usar un parámetro de campo. En mi opinión, eso es un poco más elegante.
El año fiscal no tiene ningún impacto en el cálculo incorrecto, ya que es solo otra segmentación.
El problema no es que intentaste ser eficiente y no funcionó. El problema es que el cálculo es así de erróneo.
El filtro se establece en la primera parte de la división, pero luego se divide por todas las filas de la segunda. Por lo tanto, debe configurar el filtro explícitamente en ambas partes
O como un enfoque alternativo, puede crear una medida genérica y poner el "Tipo de actividad" en una dimensión propia. Al filtrar la tabla de dimensiones, también se filtran todas las partes de la división.
Por favor, eche un vistazo al archivo adjunto, lo creé como ejemplo.
Esta sería entonces la medida genérica:
Avg Measure generic =
VAR _SumTime = SUM( ADMIN[Time])
VAR _SummarizeEmployeeDate =
SUMMARIZE (
ADMIN,
'ADMIN'[Employee ID],
'ADMIN'[Date]
)
VAR _AmountDays = COUNTROWS( _SummarizeEmployeeDate )
VAR _Result = DIVIDE( _SumTime, _AmountDays )
RETURN
_Result
Si necesitas ayuda, por favor házmelo saber.
Si respondiera a tu pregunta, me encantaría que pudieras marcar mi publicación como una solución ✔️ y darle un pulgar hacia arriba 👍
Saludos
Denis
Blog: WhatTheFact.bi
Sígueme: twitter.com/DenSelimovic
Hola
@ahiemstra He estado analizando su pbix y me temo que tengo que decir que el Informe de muestra 2 está equivocado.
Si exportas tus datos a una hoja de Excel y haces una tabla dinámica rápida, verás este resumen:
Como puedes ver, para Kyla y Tipo de Actividad = "Tiempo de Atención Indirecta" hay 52,25 horas y 42 días (en lugar de 43 días), por lo que la media es de 1,24.
Su "La medida "Promedio de Tiempo / Día de Atención Indirecta" es incorrecta debido a esta parte:
Esta parte te da 43 días (así es) pero no tiene en cuenta ningún tipo de actividad, son 43 días para todo tipo de actividad y no es lo que quieres, ¿verdad? Solo desea el recuento de días para Tipo de actividad = "Tiempo de atención indirecta".
Podrías reemplazar tu medida por esta:
Espero haberte podido ayudar a entender por qué estás obteniendo valores diferentes.
Hola @_AAndrade,
No, busco que el divisor sea de 43 días, no de 42 días. Quiero que el divisor refleje el total de días trabajados, no solo el total de días en los que el proveedor registró el tiempo de atención indirecta. Entiendo lo que dices, sin embargo, ese no es el problema aquí.
@ahiemstra Si los 43 días es el número correcto y quieres tener una medida que permita al usuario elegir el tipo de actividad, mi solución es esta:
En el Informe de Ejemplo 3, si pones esta Nueva Medida Promedio en lugar de tu Tiempo Promedio/Día, tendrás este resultado:
Kyla = 1.22
Y si eliges otro tipo de actividad en la segmentación, tendrás el gráfico respectivo.
Espero que esto sea lo que estás buscando, si necesitas ayuda por favor házmelo saber.