cneumann
Hola a todos,
Estoy creando un gráfico de ingresos netos continuos de 13 meses y encontré un requisito para mostrar los últimos 13 meses en el eje x según el mes (AAAAMM) que el usuario seleccionó en una segmentación AAAAMM.
El siguiente gráfico es el que quiero:
Para obtener el comportamiento deseado, actualmente necesito seleccionar cada uno de los 13 meses en la cortadora YYYYMM:
¿Alguna idea sobre cómo puedo hacer que esto funcione en Power BI para que el usuario solo tenga que seleccionar el mes base?
Gracias por adelantado,
cristian.
matemusic
En respuesta a cneumann
Hola de nuevo 🙂
Ahora entiendo, y probé el segundo enfoque. Creé dos tablas, que no están relacionadas con ninguna de las tablas. Uno es Año, con una columna (valores: 2010, 2011, 2012… 2016). Otro es Mes, con una columna (valores: 1,2,3…12).
Entonces creé esta medida:
Sum of profit = var Ldate = date(max('Year'[Year]);max('Month'[Month]);1) //Last date var Fdate = EDATE(Ldate;-13) //First date var SumProfit = sum('traffic'[profit]) //Calculation return if(min('Date table'[Date])<fdate; blank(); if(min('Date table'[Date])>Ldate; blank(); SumProfit))
En el eje x sumé todos los meses y años (2010-1, 2010-2…. 2016-12) y en valor sumé medida.
Mostrar elementos sin datos debe estar desmarcado.
ydiss
Hola @cneumann
Tuve un desafío similar hoy y aunque ya obtuviste una respuesta para esto y ha sido bien aceptado, realmente no parecía funcionar para mí y mis requisitos; No estoy exactamente seguro de por qué, pero la sintaxis simplemente no fue aceptada por mi parte, no me gustaba hacer referencia a Ldate en la siguiente variable entre otros problemas e, incluso si hubiera podido depurarlo y hacer que funcionara, estaba esperando una solución un poco más elegante que no implicara la creación de tablas y la codificación de mis medidas existentes.
Entonces, tuve que salir del paso (todavía soy muy nuevo, solo comencé a aprender PowerBI y DAX en el último mes) y pasé todo el día en una solución que funciona para mí y quería compartirla en caso de que alguien más pueda encontrar es útil para resolver este problema. Es una sola medida que se puede usar contra cualquier campo de fecha:
Within13MonthRange_Date = IF ( DATEDIFF( MAX('Table'[Date]), CALCULATE( MAX('Table'[Date]), ALLSELECTED()), MONTH) <= 13, 1, 0)
Esto devuelve 1 o 0.
Reemplazar ‘Tabla'[Date] con cualquier fecha en la que esté cortando (en su caso, cualquier fecha que esté en su tabla de ingresos) y devolverá 1 cada vez que los datos en el objeto visual tengan un contexto de filtro de fecha dentro de los 13 meses posteriores a la fecha máxima que haya seleccionado en su cortadora O, si no ha seleccionado nada, el máximo de 13 meses de todo su conjunto de datos.
Luego filtra su visual en la medida: es 1 y no es 0.
Utilicé esto específicamente para limitar dinámicamente las imágenes de información sobre herramientas a los datos de los últimos 12-13 meses, dependiendo de las segmentaciones que afecten a la página; sin esto, cuando no tiene nada dividido, la información sobre herramientas visual (por ejemplo, con gráficos de barras con meses a lo largo del eje X) puede mostrar demasiados datos y se recortará a los primeros 12-13 meses de datos, lo que no es útil. Al usar la medida anterior aplicada como un filtro al objeto visual de información sobre herramientas, el objeto visual siempre representa los datos de los últimos 12 o 13 meses hasta la fecha máxima dividida, por lo que siempre muestra los datos relevantes de forma dinámica. Puede cambiarlo a lo que quiera (días, meses, años y cualquier valor) todo dentro de una sola expresión DAX.
El resultado es que fui de esto:
Una información sobre herramientas que muestra datos de mayo de 2017 a abril de 2018, pero sin forma de usar el control deslizante para ver otros datos. No es bueno.
A esto:
Mucho más útil, mostrando siempre los datos de los últimos 12 meses a menos que el usuario corte (en cuyo caso mostrará el máximo de 12 meses de esos datos cortados)
Espero que esto ayude a alguien.
dpombal
En respuesta a ydiss
Mi problema es cómo arreglar el selector de una segmentación de período (por ejemplo, año-mes) en cada cambio de fila, saludos.
matemusic
Oye,
si entiendo bien su pregunta, aquí hay una idea con la función dax:
Medida = var LastDate = max(datetable[date])
var FirstDate = fecha (año (edate (LastDate; -13)); mes(edate(ÚltimaFecha;-13));1)
volver calcular (tu calculo;fechasentre(tabla de fechas[date];PrimeraFecha;ÚltimaFecha))
Algo como esto. Déjeme saber si esto le ayuda.
cneumann
En respuesta a matemusic
Hola amigo musico
Intenté su enfoque pero no resolvió mi problema.
Mi medida ya es correcta, me da la suma móvil de 12 meses basada en el mes del eje X.
El punto aquí es que tengo que restringir la tabla de fechas para mostrar solo los 13 meses anteriores al mes seleccionado. Creo que escribir una medida para esto no ayudará ya que no puedo poner una medida en el eje X.
He intentado lo siguiente basado en tu respuesta:
Last13Months = VAR LDATE = MAX ( 'msc DimDate'[Date] ) VAR FDATE = DATE ( YEAR ( EDATE ( [LastDate]; -13 ) ); MONTH ( EDATE ( [LastDate] ; -13 ) ); 1 ) RETURN DATESBETWEEN ( 'msc DimDate'[Date]; FDATE; LDATE )
Tenga en cuenta que eliminé la función CALCULAR ya que no tengo que calcular un total basado en un filtro, lo que necesito es calcular los últimos 13 meses para poner esto en el eje X.
ameya_lokhande
En respuesta a cneumann
donde esta el [Lastdate] ¿viene de?
rajendrav2016
En respuesta a ameya_lokhande
¿Qué es el cálculo del mes del año?
matemusic
En respuesta a cneumann
Hola de nuevo 🙂
Ahora entiendo, y probé el segundo enfoque. Creé dos tablas, que no están relacionadas con ninguna de las tablas. Uno es Año, con una columna (valores: 2010, 2011, 2012… 2016). Otro es Mes, con una columna (valores: 1,2,3…12).
Entonces creé esta medida:
Sum of profit = var Ldate = date(max('Year'[Year]);max('Month'[Month]);1) //Last date var Fdate = EDATE(Ldate;-13) //First date var SumProfit = sum('traffic'[profit]) //Calculation return if(min('Date table'[Date])<fdate; blank(); if(min('Date table'[Date])>Ldate; blank(); SumProfit))
En el eje x sumé todos los meses y años (2010-1, 2010-2…. 2016-12) y en valor sumé medida.
Mostrar elementos sin datos debe estar desmarcado.
musaenda
En respuesta a matemusic
Hola @matemusic,
solo quería hacerle saber que su solución me ayudó a lograr el requisito de mi usuario final.
¡¡Felicitaciones a usted!!
Anónimo
En respuesta a matemusic
Hola,
Encontre esto muy utíl. Ahora, ¿puede ayudarme a mostrar el valor del mes seleccionado en la tarjeta visual (sin conectar la tabla de años y la tabla de fechas)? uso la cortadora de aaaammm … estoy usando el año y el mes de una tabla en sí
ignas
En respuesta a matemusic
Hola @matemusic
Realmente tienes una excelente solución.
Necesito tener 2 tablas:
1. Primera tabla: debe mostrar exactamente lo que creó (funciona).
2. Segunda tabla: si se selecciona el mes, solo debe mostrar ese mes. Si no se selecciona el mes, debería mostrar todas las fechas de ese año.
Sum of profit (month) = var Ldate = date(max('Year'[Year]);max('Month'[Month]);1) //Last date var Fdate = EDATE(Ldate;0) //First date var SumProfit = sum(traffic[Amount]) //Calculation return IF(HASONEVALUE('Month'[Month]); if(min('Date table'[Date])<fdate; blank(); if(min('Date table'[Date])>Ldate; blank(); SumProfit)); [profit])
Me sale bien con la parte del mes, pero no encuentro como puedo saber la parte del año. ¿Tienes alguna idea?
Aquí está el archivo
matemusic
En respuesta a ignas
Hola, tal vez esto ayude. Agregué un nuevo año de columna en la tabla de calendario. El texto azul en negrita en el código representa el nuevo código
Sum of profit (month) = var Ldate = date(max('Year'[Year]);max('Month'[Month]);1) //Last date var Fdate = EDATE(Ldate;0) //First date VAR SYear = CALCULATE(max('Year'[Year]);ALLSELECTED()) -- it can be without calculate and allselected, i am just used to work in that way VAR SumProfitYear = CALCULATE([profit];'Date table'[Year]=SYear) var SumProfit = sum(traffic[Amount]) //Calculation return IF(HASONEVALUE('Month'[Month]); if(min('Date table'[Date])<fdate; blank(); if(min('Date table'[Date])>Ldate; blank(); SumProfit)); SumProfitYear)
Anónimo
En respuesta a matemusic
¡Gracias por la solución!
Traté de aplicar su solución, pero con 1 cortadora que tiene Mes+Año combinados. No funcionó por alguna razón.
Todavía lo conseguí trabajando duro creando 2 tablas
Tabla 1:
Mes – «01»
Año – «2017»
MesAño – «201701»
Tabla 2:
Mes – «01»
Ahora puedo usar la columna YearMonth en mi cortadora y sus soluciones todavía hacen el resto 🙂
cneumann
En respuesta a matemusic
Hola @matemusic,
Gran solución.
¡Gracias!
CheenuSing
En respuesta a matemusic
Hola @matemusic
Excelente solución.
Salud
CheenuSing
bhaveshpatel
Hola,
Puede usar el cortador de elementos visuales de la línea de tiempo para sus requisitos específicos.
Esto se puede descargar en
https://app.powerbi.com/visuals/
Este blog de video de amir netz le brindará más información sobre cómo aprovechar ese elemento visual para sus requisitos específicos.
https://powerbi.microsoft.com/en-us/blog/visual-awesomeness-unlocked-the-timeline-slicer/
Gracias y Saludos,
Bhavesh
cneumann
En respuesta a bhaveshpatel
Hola Bhavesh,
Ya he visto este elemento visual personalizado, pero «visualmente» no encaja muy bien en los informes, ya que ocupa demasiado espacio en la vista del informe.
Además, no cubre completamente los requisitos, ya que es necesario seleccionar el rango, no solo seleccionar el mes base y las porciones visuales el mes base más los últimos 12 meses.
En el foro de ideas de PowerBI, hay una publicación que solicita mejores filtros de rango de fechas, lo que espero que haga que la función de corte de tiempo sea más aplicable.
Gracias por su respuesta,
cristian.
v-micsh-msft
En respuesta a cneumann
Hola cneumann,
Ya hay preguntas hechas en los foros aquí para solicitar las cortadoras para un rango de tiempo especial.
Bueno, actualmente no puedo dar ninguna resolución DAX con respecto a cómo escribir la medida para trabajar con un rango de tiempo, basado en una sola selección.
Revisa el hilo similar:
http://community.powerbi.com/t5/Desktop/Dynamic-Display-Last-12-Months-in-Visual-According-to-Month/…
Por cierto, he votado por Mejores filtros de rango de tiempo.
Saludos
cneumann
En respuesta a v-micsh-msft
Hola Michael,
Gracias por su respuesta.
Esperemos a que lleguen los mejores filtros de rango de tiempo. Por ahora, nuestro cliente utilizará la segmentación YYYYMM y la segmentación de la línea de tiempo.
-Cristian.
bhaveshpatel
En respuesta a cneumann
Hola cristian,
¿Podemos aprovechar el poder de DAX para implementar su requisito específico?
DAX puede pulir su medida de manera que cada vez que el usuario final seleccione el mes específico, mostrará los últimos 13 meses de ingresos continuos.
Avísame si puedo ayudarte más.
Gracias y Saludos,
Bhavesh