Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers!
Enter the sweepstakes now!Prepping for a Fabric certification exam? Join us for a live prep session with exam experts to learn how to pass the exam. Register now.
Sospecho que esto será fácil para alguien con una mejor comprensión de DAX (actualmente mi conjunto de habilidades más débil, trabajo en progreso) y que no ha estado mirando el problema durante horas.
Esta medida funciona...
LeaveDaysDynamic =
SUMX(
FILTER(
VALUES(EMLAC[DET_NUMBER]),
[Leave Days] >= MIN(DaysGroup[MinValue])
&& [Leave Days] < MAX(DaysGroup[MaxValue])
),
[Leave Days]
)
Este no...
LeaveSummaryDaysDynamic =
SUMX(
FILTER(
VALUES( LeaveSummary),
[Leave Summary Days] >= MIN(DaysGroup[MinValue])
&& [Leave Summary Days] < MAX(DaysGroup[MaxValue])
),
[Leave Summary Days]
)
Necesito entender lo que VALUES(EMLAC[DET_NUMBER]) vs VALUES( LeaveSummary) está haciendo y lo que debo usar para que funcione.
DaysGroup es la tabla desconectada que estoy usando para crear contenedores en el informe.
LeaveSummary es una tabla agregada de EMLAC con algunas columnas eliminadas para que pueda mostrar datos independientemente del RLS.
|
Las barras grises deben mostrar lo mismo que las barras azules de esta imagen, ya que no hay ningún filtro de ubicación seleccionado.
|
Leave Days = SUM(EMLAC[Total Days])
LeaveDaysDynamic =
SUMX(
FILTER(
VALUES(EMLAC[DET_NUMBER]),
[Leave Days] >= MIN(DaysGroup[MinValue])
&& [Leave Days] < MAX(DaysGroup[MaxValue])
),
[Leave Days]
)
Total Leave Days for Location =
CALCULATE(
[LeaveDaysDynamic],
ALL(DaysGroup[Days Group], DaysGroup[Days Group Sort Order])
)
Leave Days % = DIVIDE([LeaveDaysDynamic], [Total Leave Days for Location])
Leave Summary Days = SUM(LeaveSummary[Total Days])
LeaveSummaryDaysDynamic =
SUMX(
FILTER(
VALUES( LeaveSummary),
[Leave Summary Days] >= MIN(DaysGroup[MinValue])
&& [Leave Summary Days] < MAX(DaysGroup[MaxValue])
),
[Leave Summary Days]
)
Sospecho que esto funcionará bien una vez que LeaveSummaryDaysDynamic esté arreglado.
Leave Days % (All Locations) =
// IF(
// ISFILTERED(EMPOS[GNA_ORG_NAME]),
DIVIDE(
[LeaveSummaryDaysDynamic]
, [Leave Days (Grand Total)])
// , BLANK()
// )
He dado muestras de datos limpias a continuación. Creo que eso es todo lo que se necesita para resolver esto.
DET_NUMBER | LAC_LVE_TYPE | Total de días |
1 | VIEJO | 3 |
1 | ANN | 49.55825394 |
1 | ANN | 0 |
1 | LSL | 4.00000241 |
2 | VIEJO | -1.57142857 |
2 | ANN | 26.72894555 |
2 | ANN | 0 |
2 | LSL | 1.14632565 |
3 | VIEJO | 0 |
3 | ANN | 9.05906 |
3 | ANN | 0 |
3 | LSL | 2.00000164 |
4 | VIEJO | 0 |
4 | ANN | 83.54460893 |
4 | ANN | 0 |
4 | LSL | 0 |
5 | VIEJO | 0 |
5 | ANN | 27.50526516 |
5 | ANN | 0 |
5 | LSL | 15 |
6 | VIEJO | 1.11111111 |
6 | ANN | 37.03696825 |
6 | ANN | 0 |
6 | LSL | 0 |
7 | VIEJO | 0 |
7 | ANN | 59.54109603 |
7 | ANN | 0 |
7 | LSL | 0 |
8 | VIEJO | 1 |
8 | ANN | 4.00456556 |
8 | ANN | 0 |
8 | LSL | 1.99999826 |
GNA_ORG_NAME | LAC_LVE_TYPE | Total de días |
a | VIEJO | 0 |
a | ANN | 59.54109603 |
a | LSL | 0 |
b | VIEJO | 0 |
b | ANN | 83.54460893 |
b | LSL | 0 |
c | VIEJO | 1.11111111 |
c | ANN | 37.03696825 |
c | LSL | 0 |
d | VIEJO | 1.42857143 |
d | ANN | 85.34625949 |
d | LSL | 7.1463297 |
e | VIEJO | 0 |
e | ANN | 27.50526516 |
e | LSL | 15 |
f | VIEJO | 1 |
f | ANN | 4.00456556 |
f | LSL | 1.99999826 |
Días Grupales | Orden de clasificación de grupos de días | MinValue | MaxValue |
< 20 | 10 | -1000 | 20 |
20-30 | 20 | 20 | 30 |
30-40 | 30 | 30 | 40 |
40-50 | 40 | 40 | 50 |
50-60 | 50 | 50 | 60 |
60-70 | 60 | 60 | 70 |
70-80 | 70 | 70 | 80 |
80-90 | 80 | 80 | 90 |
90-100 | 90 | 90 | 100 |
> 100 | 100 | 100 | 1000 |
Gracias por las respuestas.
Finalmente llegué al fondo de la cuestión. Los datos de origen que se suponía que eran únicos en el sistema de origen no lo eran. Historia de mi vida.
Una vez que limpié eso, mi original, así como todas las medidas sugeridas también funcionaron. Debería haber vuelto a la fuente desde el principio.
Disculpas por perder el tiempo.
Ya que tengo su atención.
Suponiendo que cada fila de la tabla es única, ¿hay una forma "mejor" o más eficiente de escribir esas medidas?
por ejemplo, SUMX(FILTER(VALUES(Table[Column])... o SUMX(FILTER(VALUES(Table), ... o SUMX(RESUMIR... otro patrón?
El patrón básico parece estar bien, pero probablemente pueda evitar volver a calcular los mismos valores varias veces con algunas variables. Por ejemplo
LeaveDaysDynamic =
VAR _Min = MIN ( DaysGroup[MinValue] )
VAR _Max = MAX ( DaysGroup[MaxValue] )
VAR _CalcDays =
ADDCOLUMNS ( VALUES ( EMLAC[DET_NUMBER] ), "@Days", [Leave Days] )
RETURN
SUMX (
FILTER ( _CalcDays, [@Days] >= _Min && [@Days] < _Max ),
[@Days]
)
@KNP si ve el diagrama a continuación, basado en sus datos de muestra, En el cuadro rojo, una nueva medida que proporcioné, amarillo resaltado su medida original y tarjeta visual que muestra el total de días de resumen y el total de coincidencias en todas partes. Algo más está sucediendo con su modelo real, ya que mencionó que hay muchas más columnas en la tabla, si recorta su tabla a solo 3 columnas que dio en el ejemplo y luego prueba la medida, ¿qué obtiene?
Es difícil depurar lo que está sucediendo con información parcial
@KNP probar esta medida, hágame saber si funciona, supongo que desea iterar sobre cada fila única en función de GNA_ORG_NAME y LAV_LVE_TYPE para obtener el Total de Días:
Los datos de ejemplo de Leave Summary que proporcionó no son lo suficientemente buenos como para producir el problema porque cada fila de los datos de ejemplo es única.
LeaveSummaryDaysDynamic =
SUMX (
SUMMARIZE (
LeaveSummary,LeaveSummary[GNA_ORG_NAME],LeaveSummary[LAC_LVE_TYPE], "@LeaveSummaryDays", [Leave Summary Days]
),
IF (
[@LeaveSummaryDays] >= MIN ( DaysGroup[MinValue] ) &&
[@LeaveSummaryDays] < MAX ( DaysGroup[MaxValue] ),
[@LeaveSummaryDays]
)
)
Yo lo haría ❤ Elogios si mi solución ayudó. 👉 Si puede dedicar tiempo a publicar la pregunta, también puede hacer esfuerzos para felicitar a quien ayudó a resolver su problema. ¡Es una muestra de agradecimiento!
⚡ Visítenos en https://perytus.com, su ventanilla única para proyectos/formación/consultoría relacionados con Power BI.
@parry2k - Sus suposiciones son correctas. Tenía esperanzas cuando vi su medida, pero desafortunadamente todavía está devolviendo números incorrectos. Me sorprendería si las filas de la tabla real no fueran únicas.
No puedo entender por qué el total en los >100 días es tan alto (y equivocado).
Hola: cuando se utiliza una tabla en la función VALORES, se devuelve una tabla con las mismas columnas. Cuando se utiliza una columna en la función VALORES, se devuelve una tabla de una sola columna. LeaveDaysDynamic calcula los días de licencia para cada valor único a partir del [DET_NUMBER] de la tabla EMLAC con el mínimo/máximo especificado, mientras que LeaveSummaryDaysDynamic se alimenta de una tabla con varias columnas como base. ¿El campo DET_NUMBER también está disponible en la tabla de resumen? Si es así, puede usarlo dentro de VALORES.
Documentación
https://docs.microsoft.com/en-us/dax/values-function-dax
Valor devuelto
Cuando el parámetro de entrada es un nombre de columna, una tabla de una sola columna. Cuando el parámetro de entrada es un nombre de tabla, se devuelve una tabla de las mismas columnas.
Observaciones
Cuando se utiliza la función VALORES en un contexto que se ha filtrado, los valores únicos devueltos por VALORES se ven afectados por el filtro. Por ejemplo, si filtra por región y devuelve una lista de los valores de Ciudad, la lista incluirá solo las ciudades de las regiones permitidas por el filtro. Para devolver todas las ciudades, independientemente de los filtros existentes, debe utilizar la función ALL para eliminar los filtros de la tabla. El segundo ejemplo muestra el uso de ALL con VALORES.
Esta función no se admite para su uso en el modo DirectQuery cuando se usa en columnas calculadas o reglas de seguridad de nivel de fila (RLS).
Para conocer los procedimientos recomendados al usar VALUES, consulte Usar SELECTEDVALUE en lugar de VALUES.
La sintaxis para los valores es que necesitamos usar el nombre de la tabla o el nombre de la columna.
VALORES ( TableNameOrColumnName)
En su DAX debe usar la columna como
VALORES(LeaveSummary
[GNA_ORG_NAME])
Utilice la siguiente función e inténtelo.
LeaveSummaryDaysDynamic =
SUMX(
FILTRO(
VALORES(LeaveSummary
[GNA_ORG_NAME]),
[Dejar días de resumen] >= MIN(DaysGroup[MinValue])
&& [Dejar días de resumen] < MAX(DaysGroup[MaxValue])
),
[Dejar días de resumen]
)
Por favor, márquelo como resuelto si funciona.
Desafortunadamente eso no ayuda.
Estos son los datos incorrectos actualmente ...
Esto es con su modificación sugerida ...
Debe coincidir con la columna LeaveDaysDynamic ya que no se aplican filtros.
¿Alguna otra idea?
¿Puede explicar la relación entre
EMLAC[DET_NUMBER]
y las columnas en dejar resumen?
Además, hay más columnas en el resumen de salidas que no están en los datos de muestra.
Creo que el problema proviene de la transición automática del contexto causada por su medida. Funciona bien en su primer ejemplo porque está iterando sobre valores únicos. En el que no funciona, está iterando sobre una tabla en lugar de una columna y no necesariamente tiene filas únicas, lo que causa problemas cuando el contexto de la fila se mueve al contexto del filtro.
@bcdobbs - DET_NUMBER es un número de empleado único y no está en la tabla de resumen. Sí, hay más columnas en la tabla de resumen (datos confidenciales).
El cambio de contexto me duele el cerebro en esta época de la semana. Es decir, cambiaría de contexto DAX, estaría encantado de cambiar el contexto al fin de semana. 😂
LeaveSummaryDaysDynamic =
SUMX(
FILTER(
VALUES( LeaveSummary),
[Leave Summary Days] >= MIN(DaysGroup[MinValue])
&& [Leave Summary Days] < MAX(DaysGroup[MaxValue])
),
[Leave Summary Days]
)
Ok, como punto de partida para solucionarlo, es considerar qué columna (s) definen de forma única el conjunto de filas que desea agregar en [Dejar días de resumen] dentro del filtro.