Join us for an expert-led overview of the tools and concepts you'll need to pass exam PL-300. The first session starts on June 11th. See you there!
Get registeredPower BI is turning 10! Let’s celebrate together with dataviz contests, interactive sessions, and giveaways. Register now.
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
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
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))
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
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"
)
)