Mostrar dinámicamente los últimos 8 trimestres

Un usuario Pregunto ✅

calgary_raptor

Hola a todos,

Tengo una pregunta sobre cómo mostrar correcta y dinámicamente 8 trimestres (trimestre actual y últimos 7 trimestres) para un informe. Antes de ir demasiado lejos en mi explicación, la función HOY () nunca funcionará correctamente porque mira la fecha de hoy y no toma en consideración todos mis requisitos. Debo agregar que me estoy conectando a una carpeta de SharePoint en prem directamente para adquirir mis datos. Esto es lo que creo que funcionaría mejor, pero no creo que Power BI pueda hacer esto:

  1. El mejor escenario sería tener una tabla que contenga solo los registros que deben verse para el trimestre actual y los últimos 7 trimestres (aunque no siempre es factible). Lo que quiero decir con esto es crear un subconjunto de los datos que necesita ver de su tabla principal que contiene todos los datos del trimestre actual y el comienzo del último trimestre. Reconocer que es muy probable que su tabla de datos existente tenga mucho más que solo 8 trimestres de datos. Podría tener varios años o incluso décadas de datos.
  2. La tabla necesitaría eliminar dinámicamente los registros antiguos a medida que comienzan los nuevos trimestres. Lo que quiero decir con esto es que si hoy es 1 de abril de 2018, el trimestre actual es ahora el segundo trimestre de 2018 y el tercer trimestre de 2016 sería el último trimestre. El 31 de marzo de 2018, el trimestre actual es el primer trimestre de 2018 y el último trimestre en mi ejemplo sería el segundo trimestre de 2016.
  3. El razonamiento de este enfoque es que una medida se puede crear y usar para forzar las relaciones en los datos para mostrar secciones de los datos que no tienen intersecciones de datos. La fórmula que usaría es la siguiente — Ejemplo MEASURE = IF (ISBLANK (COUNT (‘Table'[Column])), 0, COUNT (‘Tabla'[Column])) — La razón por la que usaría esta medida de ejemplo es porque Power BI es terrible para reconocer fechas y períodos de datos que no tienen intersecciones de datos. Simplemente no conectará los puntos, por así decirlo, como lo hace Excel. Si, por ejemplo, tengo datos para una ciudad o lo que sea entre el primer trimestre de 2017 y el cuarto trimestre de 2017 y si no hubo datos para el segundo o tercer trimestre, no trazará los puntos en un gráfico. En otras palabras, no trazará los puntos de datos de los 4 trimestres, solo mostrará los datos del primer y cuarto trimestre y esto se ve horrible, extremadamente inconexo y muy engañoso para quienes consumen el informe. Sería lo mismo durante meses. Si tuvo 5 meses sin datos y todos los demás meses tenían datos, no se conectarán los 12 meses, solo los meses que tienen datos.
  4. Es necesario que la tabla tenga la capacidad de comprender qué es un trimestre y cuando comienza el nuevo trimestre, el último cae y el siguiente en la línea es el último nuevo trimestre, como se mencionó anteriormente.
  5. Esto implica que es probable que se deba construir otra tabla para reconocer los trimestres y para que se establezca algún tipo de relación con los datos que está utilizando principalmente, supongo.

Espero haberme explicado lo suficientemente bien. Cualquier conjunto de datos básicos funcionaría en esta situación. Ciertamente puedo crear algunos datos ficticios para ayudar a que la solución se mueva. ¡Seguramente, alguien es lo suficientemente inteligente como para encontrar una solución en esta comunidad para este problema tan probable! ¿Quizás esto simplemente no se puede hacer en absoluto sin importar cuál sea el enfoque? Todavía no he encontrado nada en línea, ya sea en estos foros o en blogs, que funcione como se esperaba. ¡Estoy completamente perplejo aquí! Sé con certeza que cualquier solución que se le ocurra a alguien (si al final es la solución correcta) ayudará enormemente a la comunidad.

¡Se agradece cualquier ayuda!

Gracias,

calgary_raptor

Greg_Deckler

De acuerdo, tomé mis semanas rodantes y meses rodantes y creé algunas medidas para el trimestre rodante. Lo agregaré a la galería de medidas rápidas pronto, pero aquí está mientras tanto. Este enfoque utiliza medidas para crear tablas dinámicas en la memoria que se utilizan en los cálculos. Creo que esto es superior a una tabla como usted describe, ya que las tablas son estáticas una vez que se cargan los datos.

Primero necesita estas dos medidas para calcular el comienzo y el final de los trimestres. Este enfoque es un poco exagerado para este propósito, pero tiene en cuenta el hecho de que no todos estarán necesariamente en los trimestres del calendario estándar, por lo que puede ajustarlo en la fórmula, pero probablemente también podría salirse con la suya con una fórmula más fácil para esto. Independientemente:

mFIN DEL TRIMESTRE

mEnd of Quarter = 
//Get information about the current date
VAR myDate = MAX('Calendar'[Date])
VAR myQuarter = ROUNDUP(MONTH(myDate)/3,0)
VAR myYear = YEAR(myDate)
//Set min and max for Calendar table
VAR minDate = CALCULATE(MIN('Calendar'[Date]),ALL('Calendar'))
VAR maxDate = CALCULATE(MAX('Calendar'[Date]),ALL('Calendar'))
//Create calendar table and add required columns
VAR dateTable = CALENDAR(minDate,maxDate)
VAR dateTable1 = ADDCOLUMNS(dateTable,"Quarter",ROUNDUP(MONTH([Date])/3,0))
//Return date that matches the current year and weeknum and is a week day of 7 (Saturday)
VAR QuarterEndDate = MAXX(FILTER(dateTable1,YEAR([Date])=myYear&&[Quarter]=myQuarter),[Date])
//Return a nicely formatted week ending format "W# Week Ending mm/dd/yyyy"
RETURN QuarterEndDate

mInicio del trimestre

mStart of Quarter = 
//Get information about the current date
VAR myDate = MAX('Calendar'[Date])
VAR myQuarter = ROUNDUP(MONTH(myDate)/3,0)
VAR myYear = YEAR(myDate)
//Set min and max for Calendar table
VAR minDate = CALCULATE(MIN('Calendar'[Date]),ALL('Calendar'))
VAR maxDate = CALCULATE(MAX('Calendar'[Date]),ALL('Calendar'))
//Create calendar table and add required columns
VAR dateTable = CALENDAR(minDate,maxDate)
VAR dateTable1 = ADDCOLUMNS(dateTable,"Quarter",ROUNDUP(MONTH([Date])/3,0))
VAR dateTable2 = ADDCOLUMNS(dateTable1,"Day",DAY([Date]))
//Return date that matches the current year and quarter and is a day number of 1
VAR QuarterStartDate = MINX(FILTER(dateTable2,YEAR([Date])=myYear&&[Quarter]=myQuarter&&[Day]=1),[Date])
//Return a nicely formatted week ending format "W# Week Ending mm/dd/yyyy"
RETURN QuarterStartDate

Aquí está el código para calcular el comienzo y el final de los trimestres móviles (en mi caso, 3 trimestres móviles hacia atrás, por lo que se incluye el trimestre actual como una ventana de 4 trimestres móviles).

Cuarto de final rodante

Rolling Quarter End = 
VAR DateFrom = MAX([Date])
VAR QuartersBack = 0
VAR myQaurter = ROUNDUP(MONTH(DateFrom)/3,0)
VAR myYearQuarter = VALUE(CONCATENATE(YEAR(DateFrom),FORMAT(myQaurter,"##")))
VAR tmpCalendar = CALCULATETABLE('Calendar',ALL('Calendar'))
VAR tmpCalendar1 = ADDCOLUMNS(tmpCalendar,"QuarterEnding",[mEnd of Quarter],"QuarterStarting",[mStart of Quarter])
VAR LookupDate = EOMONTH(DateFrom,-1*QuartersBack*3)
VAR tmpCalendar2 = FILTER(tmpCalendar1,[Date]=LookupDate)
RETURN MAXX(tmpCalendar2,[QuarterEnding])

Comienzo del trimestre rodante

Rolling Quarter Start = 
VAR DateFrom = MAX([Date])
VAR QuartersBack = 3
VAR myQaurter = ROUNDUP(MONTH(DateFrom)/3,0)
VAR myYearQuarter = VALUE(CONCATENATE(YEAR(DateFrom),FORMAT(myQaurter,"##")))
VAR tmpCalendar = CALCULATETABLE('Calendar',ALL('Calendar'))
VAR tmpCalendar1 = ADDCOLUMNS(tmpCalendar,"QuarterEnding",[mEnd of Quarter],"QuarterStarting",[mStart of Quarter])
VAR LookupDate = EOMONTH(DateFrom,-1*QuartersBack*3)
VAR tmpCalendar2 = FILTER(tmpCalendar1,[Date]=LookupDate)
VAR retValue = MAXX(tmpCalendar2,[QuarterStarting])
RETURN IF(ISBLANK(retValue),MINX(tmpCalendar1,[QuarterStarting]),retValue)

Y así es como podrías usarlo todo junto:

Rolling Quarter Sales = 
VAR rollquarterstart = [Rolling Quarter Start]
VAR rollquarterend = [Rolling Quarter End]
VAR tmpTable = ALL('Sales')
VAR tmpTable1 = FILTER(tmpTable,[Date]>=rollquarterstart&&[Date]<=rollquarterend)
RETURN SUMX(tmpTable1,[Value])

Greg_Deckler

De acuerdo, tomé mis semanas rodantes y meses rodantes y creé algunas medidas para el trimestre rodante. Lo agregaré a la galería de medidas rápidas pronto, pero aquí está mientras tanto. Este enfoque utiliza medidas para crear tablas dinámicas en la memoria que se utilizan en los cálculos. Creo que esto es superior a una tabla como usted describe, ya que las tablas son estáticas una vez que se cargan los datos.

Primero necesita estas dos medidas para calcular el comienzo y el final de los trimestres. Este enfoque es un poco exagerado para este propósito, pero tiene en cuenta el hecho de que no todos estarán necesariamente en los trimestres del calendario estándar, por lo que puede ajustarlo en la fórmula, pero probablemente también podría salirse con la suya con una fórmula más fácil para esto. Independientemente:

mFIN DEL TRIMESTRE

mEnd of Quarter = 
//Get information about the current date
VAR myDate = MAX('Calendar'[Date])
VAR myQuarter = ROUNDUP(MONTH(myDate)/3,0)
VAR myYear = YEAR(myDate)
//Set min and max for Calendar table
VAR minDate = CALCULATE(MIN('Calendar'[Date]),ALL('Calendar'))
VAR maxDate = CALCULATE(MAX('Calendar'[Date]),ALL('Calendar'))
//Create calendar table and add required columns
VAR dateTable = CALENDAR(minDate,maxDate)
VAR dateTable1 = ADDCOLUMNS(dateTable,"Quarter",ROUNDUP(MONTH([Date])/3,0))
//Return date that matches the current year and weeknum and is a week day of 7 (Saturday)
VAR QuarterEndDate = MAXX(FILTER(dateTable1,YEAR([Date])=myYear&&[Quarter]=myQuarter),[Date])
//Return a nicely formatted week ending format "W# Week Ending mm/dd/yyyy"
RETURN QuarterEndDate

mInicio del trimestre

mStart of Quarter = 
//Get information about the current date
VAR myDate = MAX('Calendar'[Date])
VAR myQuarter = ROUNDUP(MONTH(myDate)/3,0)
VAR myYear = YEAR(myDate)
//Set min and max for Calendar table
VAR minDate = CALCULATE(MIN('Calendar'[Date]),ALL('Calendar'))
VAR maxDate = CALCULATE(MAX('Calendar'[Date]),ALL('Calendar'))
//Create calendar table and add required columns
VAR dateTable = CALENDAR(minDate,maxDate)
VAR dateTable1 = ADDCOLUMNS(dateTable,"Quarter",ROUNDUP(MONTH([Date])/3,0))
VAR dateTable2 = ADDCOLUMNS(dateTable1,"Day",DAY([Date]))
//Return date that matches the current year and quarter and is a day number of 1
VAR QuarterStartDate = MINX(FILTER(dateTable2,YEAR([Date])=myYear&&[Quarter]=myQuarter&&[Day]=1),[Date])
//Return a nicely formatted week ending format "W# Week Ending mm/dd/yyyy"
RETURN QuarterStartDate

Aquí está el código para calcular el comienzo y el final de los trimestres móviles (en mi caso, 3 trimestres móviles hacia atrás, por lo que se incluye el trimestre actual como una ventana de 4 trimestres móviles).

Cuarto de final rodante

Rolling Quarter End = 
VAR DateFrom = MAX([Date])
VAR QuartersBack = 0
VAR myQaurter = ROUNDUP(MONTH(DateFrom)/3,0)
VAR myYearQuarter = VALUE(CONCATENATE(YEAR(DateFrom),FORMAT(myQaurter,"##")))
VAR tmpCalendar = CALCULATETABLE('Calendar',ALL('Calendar'))
VAR tmpCalendar1 = ADDCOLUMNS(tmpCalendar,"QuarterEnding",[mEnd of Quarter],"QuarterStarting",[mStart of Quarter])
VAR LookupDate = EOMONTH(DateFrom,-1*QuartersBack*3)
VAR tmpCalendar2 = FILTER(tmpCalendar1,[Date]=LookupDate)
RETURN MAXX(tmpCalendar2,[QuarterEnding])

Comienzo del trimestre rodante

Rolling Quarter Start = 
VAR DateFrom = MAX([Date])
VAR QuartersBack = 3
VAR myQaurter = ROUNDUP(MONTH(DateFrom)/3,0)
VAR myYearQuarter = VALUE(CONCATENATE(YEAR(DateFrom),FORMAT(myQaurter,"##")))
VAR tmpCalendar = CALCULATETABLE('Calendar',ALL('Calendar'))
VAR tmpCalendar1 = ADDCOLUMNS(tmpCalendar,"QuarterEnding",[mEnd of Quarter],"QuarterStarting",[mStart of Quarter])
VAR LookupDate = EOMONTH(DateFrom,-1*QuartersBack*3)
VAR tmpCalendar2 = FILTER(tmpCalendar1,[Date]=LookupDate)
VAR retValue = MAXX(tmpCalendar2,[QuarterStarting])
RETURN IF(ISBLANK(retValue),MINX(tmpCalendar1,[QuarterStarting]),retValue)

Y así es como podrías usarlo todo junto:

Rolling Quarter Sales = 
VAR rollquarterstart = [Rolling Quarter Start]
VAR rollquarterend = [Rolling Quarter End]
VAR tmpTable = ALL('Sales')
VAR tmpTable1 = FILTER(tmpTable,[Date]>=rollquarterstart&&[Date]<=rollquarterend)
RETURN SUMX(tmpTable1,[Value])

Greg_Deckler

Parece que mis Medidas rápidas para meses y semanas cambiantes serían un buen modelo para basar esto. Si tengo algo de tiempo, intentaré crear uno para Rolling Quarters. Pero, mientras tanto, aquí están los enlaces:

https://community.powerbi.com/t5/Quick-Measures-Gallery/Rolling-Weeks/mp/391694

https://community.powerbi.com/t5/Quick-Measures-Gallery/Rolling-Months/mp/391499

También puede resultarle útil este:

https://community.powerbi.com/t5/Quick-Measures-Gallery/Quarter/mp/391541

Anónimo

En respuesta a Greg_Deckler

Hola ,

¿Podemos hacer las mismas cosas con Date Slicer? Mi fecha de inicio no debe estar codificada como la fecha de hoy, debe provenir de Slicer.


@Greg_Deckler escribió:

Parece que mis Medidas rápidas para meses y semanas cambiantes serían un buen modelo para basar esto. Si tengo algo de tiempo, intentaré crear uno para Rolling Quarters. Pero, mientras tanto, aquí están los enlaces:

https://community.powerbi.com/t5/Quick-Measures-Gallery/Rolling-Weeks/mp/391694

https://community.powerbi.com/t5/Quick-Measures-Gallery/Rolling-Months/mp/391499

También puede resultarle útil este:

https://community.powerbi.com/t5/Quick-Measures-Gallery/Quarter/mp/391541


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *