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

Power BI is turning 10! Let’s celebrate together with dataviz contests, interactive sessions, and giveaways. Register now.

Reply
Syndicate_Admin
Administrator
Administrator

Dos comportamientos diferentes con una medida similar

Hola

Estoy tratando de entender por qué a veces necesito usar FILTER en mi medida CALCULATE. Permítanme explicar el contexto:

Tengo esta medida:

CA HT pec locations à J = 
CALCULATE(
    SUM(fait_pec_ligne[pec_ligne_ht]),
    fait_pec_ligne[pec_ligne_type] = 1
    ,(fait_pec_file_active[pec_etat_general] = "En Traitement" || fait_pec_file_active[pec_etat_general] = "Bloquée")
)

Esto funciona según lo esperado. Calcula una SUMA a partir de la tabla "fait_pec_ligne" y filtra con datos de otra tabla "fait_pec_file_active".
Y no necesito usar FILTER para obtener el resultado esperado. Esas dos tablas de hechos están conectadas con relaciones activas (a través de una tabla de dimensiones entre ellas).

Ahora tengo otra medida:

CA HT N-2 à N = 
 CALCULATE(
    SUM(fait_facture[facture_ht])
    ,dim_calendrier[calendrier_annee_numero] >= YEAR(TODAY()) - 2
    && dim_calendrier[calendrier_annee_numero] <= YEAR(TODAY())
    )
 )

Hace más o menos lo mismo (una SUM) en una tabla de hechos "fait_facture". Y filtra las filas que intentamos sumar, con la tabla de calendario de dimensiones.
Si utilizo esta medida en un gráfico de líneas (eje Y) y pongo el año de la tabla del calendario (eje X), la línea no se filtra al período solicitado en la medida. Mis líneas comienzan antes de YEAR(TODAY()) - 2.
Las dos tablas están conectadas entre sí con una relación activa con una columna de fecha.
Y ahora si modifico mi último compás de esta manera:

CA HT N-2 à N = 
 CALCULATE(
    SUM(fait_facture[facture_ht])
    ,FILTER(
        dim_calendrier
        ,dim_calendrier[calendrier_annee_numero] >= YEAR(TODAY()) - 2
        && dim_calendrier[calendrier_annee_numero] <= YEAR(TODAY())
    )
 )

Está funcionando bien y mi gráfico de líneas está filtrado al año que pedí.

Y no entiendo el punto de por qué en la primera medida, no necesito usar FILTER para filtrar una tabla con otra tabla conectada y en la segunda medida, necesito usar FILTER para obtener un resultado correcto en mi gráfico de líneas.

En ambos casos, las tablas están conectadas con relaciones activas.

Gracias de antemano por su ayuda

6 REPLIES 6
Syndicate_Admin
Administrator
Administrator

La mejor manera de aprender sobre CALCULAR y FILTRAR es jugar y experimentar ...

Por ejemplo, use estos datos de prueba


EmpleadoGradoSalario

Empleado Grado Sueldo
Pedro 1 1000
María 2 2220
Demandar 3 3450
Jane 4 1560
Henrio 1 4890
Agalla 2 5360
Oscar 3 7545
Sheila 4 8000
Paul 5 7800

y use esta salida de ejemplo

speedramps_4-1739462312878.png

Mira mi ejemplo PBIX

El comando FILTER crea una tabla temporary.
Por ejemplo

Staff on 2 to 4 = 
var tempfile  = 
FILTER(
    yourdata,
    yourdata[Grade] >= 2 &&
    yourdata[Grade] <= 4)
RETURN
COUNTROWS(tempfile)

El valor predeterminado del comando SUM es el contexto natural

Salaries = 
SUM(yourdata[Salary])

El comando CALCULATE puede anular el contexto natural con el archivo temporal FILTER.
Esto se puede hacer con o sin VAR.
Prefiero con un VAR porque es más fácil de aprender, documentar, probar y depurar.

Filter1 = 
var tempfile  = 
FILTER(
    yourdata,
    yourdata[Grade] >= 2 &&
    yourdata[Grade] <= 4)
RETURN
CALCULATE(
    SUM(yourdata[Salary]),
    tempfile
)

Filter2 = 
CALCULATE(
    SUM(yourdata[Salary]),
    FILTER(
    yourdata,
    yourdata[Grade] >= 2 &&
    yourdata[Grade] <= 4))

speedramps_2-1739461360339.png

Sin embargo, podemos codificar el CALCULATE sin el FILTER y obtener los mismos resultados
porque DAX aplica automáticamente el FILTER al CALCULATE en este escenario

Calculate 1 = 

CALCULATE(
  SUM(yourdata[Salary]),
   yourdata[Grade] IN {2,3,4}
   )

Calculate 2 = 

CALCULATE(
  SUM(yourdata[Salary]),
   yourdata[Grade] >= 2 &&
   yourdata[Grade] <= 4 
   )

Conoce más sobre CALCUALTE y FILTER aquí

https://learn.microsoft.com/en-us/dax/calculate-function-dax

https://learn.microsoft.com/en-us/dax/filter-functions-dax#

https://www.youtube.com/watch?v=SOTQ3MiTXT4

https://www.youtube.com/watch?v=-oDpOfhgmzA

Por favor, haga clic en el pulgar hacia arriba para toda esta información útil

y haga clic en aceptar solución si ahora es sabio acerca de CALCULAR y FILTRAR,

Gracias

Syndicate_Admin
Administrator
Administrator

Aquí hay 2 cosas. En su segunda medida, está pasando la tabla de calendario entrire como un argumento de filtro, no necesita hacer eso, solo necesita las condiciones de filtro.

Además, dado que está filtrando en la columna de año y usándola en el eje del gráfico, debe usar KEEPFILTERS para que el filtro del gráfico se combine con el filtro de la medida, en lugar de ser sobrescrito por él

CA HT N-2 à N =
CALCULATE (
    SUM ( fait_facture[facture_ht] ),
    KEEPFILTERS (
        dim_calendrier[calendrier_annee_numero]
            >= YEAR ( TODAY () ) - 2
            && dim_calendrier[calendrier_annee_numero] <= YEAR ( TODAY () )
    )
)

Lo siento, cometí un error en el copiar y pegar de mi segundo compás. Lo he corregido en mi publicación.

Eso está bien, pero mi punto sobre KEEPFILTERS aún se mantiene. Supongo que al usar la medida original, no estaba usando la columna pec_etat_general en el objeto visual. Hay una diferencia fundamental entre aplicar filtros en columnas que se usan en un objeto visual o no. Si la columna se usa en un objeto visual, debe usar KEEPFILTERS, de lo contrario, se sobrescribirá el filtro del objeto visual.

Tienes razón, no estaba usando la columna pec_etat_general en el visual, solo en la medida.
Ok, haré algunas pruebas e intentaré usar la columna pec_etat_general en el visual para ver el comportamiento.
Dices que se use keepfilters, pero parece que también funciona como se esperaba con FILTER. ¿Quizás el resultado que obtengo con FILTER en el visual es incorrecto? ¿Y debería ser más preciso con KEEPFILTERS?

No es necesario especificar explícitamente FILTER, que se gestiona automáticamente por usted. De hecho, el motor DAX traduce la primera medida a

CA HT pec locations à J =
CALCULATE (
    SUM ( fait_pec_ligne[pec_ligne_ht] ),
    fait_pec_ligne[pec_ligne_type] = 1,
    FILTER (
        ALL ( fait_pec_file_active[pec_etat_general] ),
        fait_pec_file_active[pec_etat_general] = "En Traitement"
            || fait_pec_file_active[pec_etat_general] = "Bloquée"
    )
)

Helpful resources

Announcements
June 2025 Power BI Update Carousel

Power BI Monthly Update - June 2025

Check out the June 2025 Power BI update to learn about new features.

June 2025 community update carousel

Fabric Community Update - June 2025

Find out what's new and trending in the Fabric community.

Top Solution Authors