Forum Discussion
Ayuda... comprender dax Expression...
Hola a todos, gracias por su tiempo, estoy tratando de entender y por favor discúlpenme si esto es algo muy básico
.. utilizando la tabla fact internetsales que viene como Adventuresworks DB..
1)Tabla de fechas creada utilizando el AÑO MIN y MAX de la fecha ORder en la tabla FactInternetSales
dDate = CALENDARIO(FECHA(AÑO(MIN(FactInternetSales[OrderDate]) ),1,1), FECHA(AÑO(MAX(FactInternetSales[OrderDate])),12,31) )
2). Se creó una medida para el monto de las ventas
vSalesAmount = suma(FactInternetSales[SalesAmount])
intentando crear una nueva medida para el importe de las ventas del año anterior utilizando la función DATEADD .. pero lo que noto es que algo está sucediendo cuando se usa el FILTRO dentro del CALCULAR y cuando no se usa el FILTRO
cuando se utiliza FILTER en Calcular
vSalesPreviousAño = CALCULATE( [vSalesAmount],FILTER(dDate,DATEADD(dDate[Date],-1,YEAR)))
Esto es lo que veo en la matriz cuando uso el FILTRO en CALCULAR
cuando no uso el FILTRO dentro del CALCULAR veo la siguiente matriz. calcular FILTER está causando la diferencia en los resultados
vSalesPreviousYear = CALCULATE( [vSalesAmount],DATEADD(dDate[Date],-1,YEAR)) - estos números son precisos pero no los entiendo y es muy confuso. ¿Podrían algunos por favor ayudarme a entenderlo?
@Raj007 CALCULATE sin filtro incluye una instrucción IMPLÍCITA ALL que es la razón por la que está viendo una diferencia. CALCULATE y las funciones de "Inteligencia" del tiempo son cajas negras que tienen docenas y docenas de artículos de blog escritos sobre sus matices. Me parece mejor evitarlos honestamente porque es difícil predecir su comportamiento en circunstancias complejas.
CALCUHATE - Por qué no uso CALCULATE Functi... de DAX - Microsoft Power BI Community
Puede que esto le resulte útil- https://community.powerbi.com/t5/Community-Blog/To-bleep-With-Time-Intelligence/ba-p/1260000
Además, vea si mi Time Intelligence the Hard Way proporciona una forma diferente de lograr lo que está buscando.
https://community.powerbi.com/t5/Quick-Measures-Gallery/Time-Intelligence-quot-The-Hard-Way-quot-TITHW/m-p/434008
10 Replies
- Syndicate_Admin
Administrator
@Raj007 CALCULATE sin filtro incluye una instrucción IMPLÍCITA ALL que es la razón por la que está viendo una diferencia. CALCULATE y las funciones de "Inteligencia" del tiempo son cajas negras que tienen docenas y docenas de artículos de blog escritos sobre sus matices. Me parece mejor evitarlos honestamente porque es difícil predecir su comportamiento en circunstancias complejas.
CALCUHATE - Por qué no uso CALCULATE Functi... de DAX - Microsoft Power BI Community
Puede que esto le resulte útil- https://community.powerbi.com/t5/Community-Blog/To-bleep-With-Time-Intelligence/ba-p/1260000
Además, vea si mi Time Intelligence the Hard Way proporciona una forma diferente de lograr lo que está buscando.
https://community.powerbi.com/t5/Quick-Measures-Gallery/Time-Intelligence-quot-The-Hard-Way-quot-TITHW/m-p/434008 - Syndicate_Admin
Administrator
DE ACUERDO. Antes de decirte exactamente por qué ves lo que ves, déjame primero desacreditar algunos mitos que @Greg_Deckler ha estado promoviendo en este foro.
1. CALCULAR sin filtro incluye una instrucción IMPLÍCITA ALL que es similar a por qué está viendo una diferencia.
> Por supuesto, esto es totalmente falso. No existe tal ALL en CALCULATE sin un filtro. Y, por lo tanto, no es la razón por la que ves la diferencia. Voy a demostrarlo momentáneamente.
2. CALCULATE y las funciones de "Inteligencia" de tiempo son cajas negras que tienen docenas y docenas de artículos de blog escritos sobre sus matices.
> No estoy seguro de las "docenas y docenas" y todos sus "matices". Sé que tienen una interfaz muy clara y sus usos se describen claramente en dax.guide (y en la documentación de MS). Si te apegas a las reglas del juego,nunca actúan. Siempre puede predecir con precisión su comportamiento y explicarlo.
3. Me parece mejor evitarlos honestamente porque es difícil predecir su comportamiento en circunstancias complejas.
> Esta es solo una opinión personal, por supuesto, a la que todos tienen derecho. Los he estado usando durante aproximadamente ... 6 años y honestamente puedo decir que nunca han actuado conmigo una vez.
Con estos preliminares fuera del camino, déjame explicarte los resultados que estás obteniendo.
En primer lugar, uno tiene que recordar siempre y para siempre que DAX es un lenguaje muy lógico y siempre hace lo que se le dice. Si sigues las reglas (esta es la parte más difícil para la mayoría de las personas), si las conoces bien, nunca te desviarás. Pero hay que tener un grouding muy sólido en la lógica y las reglas del juego DAX.
DE ACUERDO. Vamos a diseccionar tu primera medida.
vSalesPreviousYear = CALCULATE( [vSalesAmount], FILTER( dDate, DATEADD( dDate[Date], -1, YEAR ) ) )¿Qué hace? Bueno, en primer lugar, CALCULATE debe evaluar los argumentos en el contexto actual a partir del 2º (FILTER). FILTER toma la tabla dDate tal como se ve en el contexto actual y, a continuación, itera sobre sus filas evaluando su segundo argumento (DATEADD) como una expresión booleana en el contexto ROW actual. Esta es la API de FILTER (https://dax.guide/filter). La clave para entender lo que está pasando es "una expresión booleana" y la API de DATEADD. De dax.guide/dateadd:
El primer punto se aplica aquí. Significa que DATEADD( 'dDate'[Date],...) se sustituye de hecho por DATEADD( CALCULATETABLE( DISTINCT( 'dDate'[Date] ), ...). Y esto a su vez significa que está retrocediendo en el tiempo solo una fecha, la que se está iterando actualmente. Por lo tanto, si estás en el segundo año de tu calendario, obtendrás la misma fecha hace un año. Este será un escalar no en blanco, por lo que se convertirá en TRUE. Por lo tanto, su fecha sobrevivirá al filtro. De hecho, todas las fechas lo harán, si no son en el primer año. Así que FILTER devolverá todas las fechas del contexto actual y es por eso que ves que las cifras son las mismas que la cantidad actual para todos los años a partir del 2do. Para el 1er año, verá BLANK porque dicha fecha se movió hacia atrás 1 año rinde BLANK. ¿Claro?
Su segunda medida
vSalesPreviousYear = CALCULATE( [vSalesAmount], DATEADD( dDate[Date], -1, YEAR ) )hace lo que esperas porque esta vez estás usando DATEADD no en un FILTER donde tienes un contexto de fila, sino en el contexto de filtro original. Por lo tanto, todas las fechas visibles se retrocede 1 año y luego estas fechas se devuelven desde DATEADD como una tabla. Esta tabla de valores/fechas se aplica al modelo mediante CALCULATE sobrescribiendo cualquier contexto que haya existido en la tabla dDate hasta ahora y el cálculo de [vSalesAmount] se lleva a cabo en este nuevo contexto. Por supuesto, DATEADD( CALCULATETABLE( DISTINCT( 'dDate'[Date] ), ...) todavía tiene lugar, pero como no hay contexto de fila, CALCULATETABLE no tiene ningún efecto.
Entonces, como ves, todo es tan lógico que simplemente duele. Nada de lo que @Greg_Deckler trata de hacerte creer.
- Syndicate_Admin
Administrator
@daxer todopoderoso Con respecto al ALL implícito, solo estaba reiterando la forma en que Marco Russo me lo explicó cuando tuve un extraño caso de DAX:
Re: DAX Head Scratcher - Microsoft Power BI Community
- Syndicate_Admin
Administrator
He leído esta conversación pero... está fuera de tema aquí.
"CALCULAR sin filtro incluye una instrucción IMPLÍCITA ALL que es como la razón por la que está viendo una diferencia".
DE ACUERDO. Lo tienes todo mezclado. El "TODO implícito" del que estás hablando es lo que sucede cuando escribes código como:
calculate( [measure], T[Col] = Value )que siempre se traduce en:
calculate( [measure], filter( all( T[Col] ), T[Col] = Value ) )Esto se debe a que los filtros en CALCULATE siempre deben ser tablas,no expresiones booleanas (en contraste con el segundo argumento de FILTER). Así que este atajo, o azúcar sintáctico, se ha agregado al lenguaje para no obligar a las personas a escribir constantemente la versión más larga y porque es muy común querer filtrar así.
Entonces, sí, existe un sentido en el que se puede decir "CALCULAR sin filtro incluye una declaración IMPLÍCITA ALL" pero esta declaración es altamente imprecisa y engañosa, especialmente en vista del hecho de que los argumentos para CALCULAR son siempre tablas y CALCULAR con solo el primer argumento es una declaración perfectamente válida, que por cierto no tiene un filtro y no incluye ninguna declaración (oculta) ALL al mismo tiempo.
Pero el "todo misterio" ni siquiera se aplica en este caso, ya que no hay UN CÁLCULO aquí que contenga el azúcar sintáctico que he explicado anteriormente.
- Syndicate_Admin
Administrator
Hola @Raj007,
¿Estas sugerencias ayudaron con su escenario? si ese es el caso, puede considerar Kudo o aceptar las sugerencias útiles para ayudar a otros que enfrentaron requisitos similares y encontrarlo más rápidamente.
Si esto tampoco ayuda, comparta información más detallada para ayudarnos a aclarar su escenario para probar.
Cómo obtener respuestas a su pregunta rápidamente
Saludos
Xiaoxin Sheng