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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Ptown
Helper I
Helper I

Gráfico de columnas apiladas: desea rellenar los huecos de fecha del eje X que faltan, pero dentro del filtro de intervalo de fechas relativo

Hola

Tengo un problema en Power BI Desktop al intentar crear un gráfico de columnas apiladas que tiene un filtro de fecha relativa que muestra los próximos 12 meses.

Tengo una serie de oportunidades que cada una tiene un "Valor" asociado y una "Fecha de victoria" pronosticada. Me gustaría que mi gráfico de columnas apiladas mostrara los próximos 12 meses en el eje X (independientemente de si hay alguna oportunidad en un mes determinado).

Si no hago clic en "Mostrar elementos sin datos", el eje X no muestra los siguientes 12 meses. Sólo muestra meses que tienen una oportunidad en.

Si hago clic en "Mostrar elementos sin datos", el eje X muestra mucho más que los siguientes 12 meses.

He leído innumerables publicaciones que describen los mismos o similares problemas. Entiendo exactamente lo que está pasando y por qué. Mi pregunta es: ¿Cuál es una manera simple y efectiva de lograr mi salida deseada?

He creado un archivo de ejemplo con tres pestañas. Dos de ellos muestran el problema. El tercero describe mi salida deseada.

Archivo de ejemplo

Gracias de antemano por cualquier ayuda!

1 ACCEPTED SOLUTION

Hola @Ptown ,

Simplemente cambie el eje del gráfico de Calendario[fecha] a Calendario[mes] o Calendario[monthYear].

Si utiliza este calendario, ya incluye estos campos:

let
	    Source = { Number.From(List.Min(Opportunities[Win Date]))..Number.From(List.Max(Opportunities[Win Date])) },
    convToTable = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    chgDateType = Table.TransformColumnTypes(convToTable,{{"Column1", type date}}),
    renCols = Table.RenameColumns(chgDateType,{{"Column1", "date"}}),
    addFinYear = Table.AddColumn(renCols, "finYear", each Date.Year([date]+#duration(275,0,0,0))),
    addRelativeFY = Table.AddColumn(addFinYear, "relativeFY", each [finYear] - Date.Year(DateTime.LocalNow()+#duration(275,0,0,0))),
    addFinPeriod = Table.AddColumn(addRelativeFY, "finPeriod", each if Date.Month([date]) >=4 then Date.Month([date])-3 else Date.Month([date])+9),
    addFinYearPeriod = Table.AddColumn(addFinPeriod, "finYearPeriod", each [finYear]*100+[finPeriod]),
    addFinHY = Table.AddColumn(addFinYearPeriod, "finHY", each if [finPeriod] >= 1 and [finPeriod] <= 6 then "H1" else "H2"),
    addFinQtr = Table.AddColumn(addFinHY, "finQtr", each if [finPeriod] >= 1 and [finPeriod] <= 3 then "Q1"
else if [finPeriod] >= 4 and [finPeriod] <= 6 then "Q2"
else if [finPeriod] >= 7 and [finPeriod] <= 9 then "Q3"
else "Q4"),
    addMonth = Table.AddColumn(addFinQtr, "month", each Text.Start(Date.MonthName([date]),3)),
    addMonthYear = Table.AddColumn(addMonth, "monthYear", each Text.Combine({[month], Text.End(Text.From(Date.Year
([date])),2)}, " ")),
    addDayKey = Table.AddColumn(addMonthYear, "dayKey", each Date.DayOfWeek([date])),
    addDay = Table.AddColumn(addDayKey, "day", each Text.Start(Date.DayOfWeekName([date]), 3)),
    chgAllTypes = Table.TransformColumnTypes(addDay,{{"date", type date}, {"finYear", type text}, {"finPeriod", Int64.Type}, {"finYearPeriod", Int64.Type}, {"finHY", type text}, {"finQtr", type text}, {"month", type text}, {"relativeFY", type text}, {"monthYear", type text}, {"dayKey", Int64.Type}, {"day", type text}}),
    #"Sorted Rows" = Table.Sort(chgAllTypes,{{"date", Order.Descending}})
in
    #"Sorted Rows"

En la vista de datos de la tabla Calendario, deberá seleccionar la columna [monthYear], luego ir a 'Ordenar por columna' en la cinta de opciones y seleccionar [finYearPeriod] en la lista desplegable. Esto le permitirá ordenar sus meses en orden de calendario, en lugar de alfabético.

Esto me da la siguiente salida:

BA_Pete_0-1603873267351.png

Como nota lateral: una vez que tenga su tabla de calendario en su lugar, debe ir al informe Opciones y configuración y cambiar de Inteligencia de tiempo automático. A continuación, haga clic con el botón derecho en la tabla Calendario en la lista de campos y elija "Marcar como tabla de fechas". Esto le ayudará a utilizar las funciones de Time-intel incorporadas, así como a ahorrarle mucho tamaño de modelo a medida que crece su modelo.



Now accepting Kudos! If my post helped you, why not give it a thumbs-up?

Proud to be a Datanaut!




View solution in original post

4 REPLIES 4
BA_Pete
Super User
Super User

Hola @Ptown ,

En primer lugar, cree su medida de valor de la siguiente manera:

_newValue = SUM(Opportunities[Value]) + 0

A continuación, configure una tabla Calendario. Es posible que pueda hacerlo mediante CALENDARAUTO(), pero con el conjunto de datos limitado que proporcionó creó una referencia circular al relacionarse con la tabla de hechos.

En realidad usé esto en Power Query:

let
	    Source = { Number.From(List.Min(Opportunities[Win Date]))..Number.From(List.Max(Opportunities[Win Date])) },
    convToTable = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    chgDateType = Table.TransformColumnTypes(convToTable,{{"Column1", type date}}),
    renCols = Table.RenameColumns(chgDateType,{{"Column1", "date"}})
in
    renCols

Relacione su tabla De calendario con su tabla de hechos de la siguiente manera:

Calendario[Fecha] (Uno) a Oportunidades[Fecha de Victoria] (Muchos)

Utilice Calendar[Date] para el eje y la segmentación de fecha relativa, y la nueva medida para los valores.

Esto me da la siguiente salida:

BA_Pete_0-1603818330686.png



Now accepting Kudos! If my post helped you, why not give it a thumbs-up?

Proud to be a Datanaut!




Hola @BA_Pete gracias por tu ayuda con mi pregunta,

Ese método me acerca más a lo que quiero, pero no del todo. Necesito tener espacio en el eje x para exactamente 12 columnas apiladas, una para cada mes. La salida parece tener una barra para cada día.

Para el Calendario[Fecha] intenté seleccionar 'Fecha Hierachy' en el cuadro desplegable 'Eje'. Pero entonces el eje una vez más mostró todas las fechas pasadas y futuras.

Cualquier ayuda adicional hacia mi producción requerida muy apreciado.

Hola @Ptown ,

Simplemente cambie el eje del gráfico de Calendario[fecha] a Calendario[mes] o Calendario[monthYear].

Si utiliza este calendario, ya incluye estos campos:

let
	    Source = { Number.From(List.Min(Opportunities[Win Date]))..Number.From(List.Max(Opportunities[Win Date])) },
    convToTable = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    chgDateType = Table.TransformColumnTypes(convToTable,{{"Column1", type date}}),
    renCols = Table.RenameColumns(chgDateType,{{"Column1", "date"}}),
    addFinYear = Table.AddColumn(renCols, "finYear", each Date.Year([date]+#duration(275,0,0,0))),
    addRelativeFY = Table.AddColumn(addFinYear, "relativeFY", each [finYear] - Date.Year(DateTime.LocalNow()+#duration(275,0,0,0))),
    addFinPeriod = Table.AddColumn(addRelativeFY, "finPeriod", each if Date.Month([date]) >=4 then Date.Month([date])-3 else Date.Month([date])+9),
    addFinYearPeriod = Table.AddColumn(addFinPeriod, "finYearPeriod", each [finYear]*100+[finPeriod]),
    addFinHY = Table.AddColumn(addFinYearPeriod, "finHY", each if [finPeriod] >= 1 and [finPeriod] <= 6 then "H1" else "H2"),
    addFinQtr = Table.AddColumn(addFinHY, "finQtr", each if [finPeriod] >= 1 and [finPeriod] <= 3 then "Q1"
else if [finPeriod] >= 4 and [finPeriod] <= 6 then "Q2"
else if [finPeriod] >= 7 and [finPeriod] <= 9 then "Q3"
else "Q4"),
    addMonth = Table.AddColumn(addFinQtr, "month", each Text.Start(Date.MonthName([date]),3)),
    addMonthYear = Table.AddColumn(addMonth, "monthYear", each Text.Combine({[month], Text.End(Text.From(Date.Year
([date])),2)}, " ")),
    addDayKey = Table.AddColumn(addMonthYear, "dayKey", each Date.DayOfWeek([date])),
    addDay = Table.AddColumn(addDayKey, "day", each Text.Start(Date.DayOfWeekName([date]), 3)),
    chgAllTypes = Table.TransformColumnTypes(addDay,{{"date", type date}, {"finYear", type text}, {"finPeriod", Int64.Type}, {"finYearPeriod", Int64.Type}, {"finHY", type text}, {"finQtr", type text}, {"month", type text}, {"relativeFY", type text}, {"monthYear", type text}, {"dayKey", Int64.Type}, {"day", type text}}),
    #"Sorted Rows" = Table.Sort(chgAllTypes,{{"date", Order.Descending}})
in
    #"Sorted Rows"

En la vista de datos de la tabla Calendario, deberá seleccionar la columna [monthYear], luego ir a 'Ordenar por columna' en la cinta de opciones y seleccionar [finYearPeriod] en la lista desplegable. Esto le permitirá ordenar sus meses en orden de calendario, en lugar de alfabético.

Esto me da la siguiente salida:

BA_Pete_0-1603873267351.png

Como nota lateral: una vez que tenga su tabla de calendario en su lugar, debe ir al informe Opciones y configuración y cambiar de Inteligencia de tiempo automático. A continuación, haga clic con el botón derecho en la tabla Calendario en la lista de campos y elija "Marcar como tabla de fechas". Esto le ayudará a utilizar las funciones de Time-intel incorporadas, así como a ahorrarle mucho tamaño de modelo a medida que crece su modelo.



Now accepting Kudos! If my post helped you, why not give it a thumbs-up?

Proud to be a Datanaut!




¡Gracias Pete!

Eso funciona en mis datos de muestra y creo que debería poder aplicarlo ahora a mi modelo de datos real.

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

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