Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.

Reply
Syndicate_Admin
Administrator
Administrator

Medir con la tabla desconectada como filtro

TLDR

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.

Modelo de datos (parcial)

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.

KNP_0-1648145053037.png

Visual

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.

KNP_1-1648145244102.png

Medidas

Laborable

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])

No funciona

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()
    // )

Datos desinfectados

He dado muestras de datos limpias a continuación. Creo que eso es todo lo que se necesita para resolver esto.

EMLAC

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

LeaveSummary

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íasGrupo

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

12 REPLIES 12
Syndicate_Admin
Administrator
Administrator

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]
    )
Syndicate_Admin
Administrator
Administrator

He intentado reproducir su problema dados los datos que ha proporcionado, pero estoy luchando un poco.

¿Puedes modificar el archivo que he creado o crear tu propia versión que puedas compartir?

Syndicate_Admin
Administrator
Administrator

@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

parry2k_0-1648159660907.png

Syndicate_Admin
Administrator
Administrator

@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] 
        )
    ) 

Síguenos en LinkedIn (en inglés) y YouTube.gif a nuestro YouTube (en inglés) canal

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).

KNP_0-1648158165479.png

Syndicate_Admin
Administrator
Administrator

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.

Syndicate_Admin
Administrator
Administrator

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 ...

KNP_0-1648153209437.png

Esto es con su modificación sugerida ...

KNP_1-1648153273825.png

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.

Helpful resources

Announcements
RTI Forums Carousel3

New forum boards available in Real-Time Intelligence.

Ask questions in Eventhouse and KQL, Eventstream, and Reflex.

MayPowerBICarousel

Power BI Monthly Update - May 2024

Check out the May 2024 Power BI update to learn about new features.