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
Syndicate_Admin
Administrator
Administrator

Modificación del valor mes dentro de un plazo de duración debido a la semana de mes cruzado

hola

Actualmente estoy teniendo esta dimensión de fecha creada usando Dax de la siguiente manera:

Test_Date =
------------------------------------------------------------------------
VAR WeekNumberFlag = 1
VAR WeekDayFlag = 2
VAR CalendarYearStart = 2021
VAR CalendarYearEnd = AÑO (HOY())
-------------------------------------------------------------------------
VAR CalendarBase = CALENDAR( FECHA ( CalendarYearStart , 1 , 1 ) ,
FECHA ( CalendarYearEnd , 12 , 31 ) )
HOY() )

devolución
GENERAR (
CalendarBase,
VAR CalendarCurrentDate = [Fecha]
VAR CalendarYear = AÑO ( CalendarCurrentDate )
Var CalendarMonth = MES ( CalendarCurrentDate )

VAR CalendarYearMonth = CalendarYear * 100 + CalendarMonth
VAR CalendarWeekOfYear = WEEKNUM( CalendarCurrentDate , WeekNumberFlag )

FILA DE RETORNO (
"Año", CalendarYear ,
"MonthCaption", FORMAT ( CalendarCurrentDate, "mmm" ) ,
"WeekName", "W" & CalendarWeekOfYear ,
"YearMonth", CalendarYear & "." & (si (LEN(CalendarMonth) < 2, "0" & CalendarMonth, CalendarMonth)),
"YearWeek", CalendarYear * 100 + CalendarWeekOfYear
)
)

El script genera todos los formatos de fecha estándar que se requerían para mi informe, sin embargo, el problema surge cuando tengo informe que utiliza Monthcaption y weekname ya que algunos de los registros se filtrarán debido a la semana cruzada entre diferentes meses.
A continuación se muestra el resultado de mi tabla de dimensiones de fecha que se filtró con el problema que tuve durante el mes cruzado:

Roy_tap_1-1618285080737.png

Entre el período de 1/31/2021 a 2/6/2021, se definió como W6 bajo WeekName, sin embargo, residen bajo el Mes de Enero y febrero como se muestra anteriormente, por lo que cuando muestre el informe basado solo en WeekName, el resultado se mostrará correctamente, sin embargo, cuando agregué la columna Mes, los registros en 1/31/2021 se filtrarán.

¿Cómo puedo agregar una nueva columna mes que cambiará el enero a febrero para el 1/31/2021? Como este problema persistirá durante todos los meses cruzados dentro de la dimensión de fecha, estaba pensando si existe tal manera de que el mes se pueda modificar en consecuencia en función del recuento de WeekName y YearMonth.

Por ejemplo, en este caso, si agrupamos lo siguiente, deberíamos obtener el siguiente recuento
MesCaption | | WeekName Año | contar
Jan | W6 | 2021.01 | 1
| de febrero W6 | 2021.02 | 6

A continuación, modifique Enero a Febrero.

Sin embargo, si el grupo cuenta si es mayor en enero durante febrero como se muestra, a continuación, el mes debe modificarse a Enero en su lugar:

MesCaption | | WeekName Año | contar
Jan | W5 | 2020.01 | 6
| de febrero W5 | 2020.02 | 1

Roy_tap_2-1618285990349.png

¿Hay alguna sugerencia sobre cómo podemos lograr la modificación del valor del mes en función de la suposición anterior?
Sólo un punto a tener en cuenta, entendemos que podemos aprovechar el uso del calendario ISO Weekly de formato 4-4-5 o 5-4-4, sin embargo, debido a la semana adicional / falta que podría surgir en el futuro, estamos tratando de explorar otra alternativa como se indicó anteriormente.

gracias.
1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

Ahí @Roy_tap,

Puede crear dos columnas calculadas como se indica a continuación para obtener el nombre actualizado del mes, busque los datos adjuntos para los detalles.

1. Crear campo de lunes a viernes

Weekday = WEEKDAY('Test_Date'[Date],2)

2. Cree otra columna calculada para obtener el nombre actualizado del mes

New Month =
VAR _minmonth =
    MONTH (
        CALCULATE (
            MIN ( 'Test_Date'[Date] ),
            FILTER (
                'Test_Date',
                'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                    && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
            )
        )
    )
VAR _maxmonth =
    MONTH (
        CALCULATE (
            MAX ( 'Test_Date'[Date] ),
            FILTER (
                'Test_Date',
                'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                    && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
            )
        )
    )
VAR _weekday =
    CALCULATE (
        MIN ( 'Test_Date'[Weekday] ),
        FILTER (
            'Test_Date',
            'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
                && DAY ( 'Test_Date'[Date] ) = 1
        )
    )
VAR _mindate =
    CALCULATE (
        MIN ( 'Test_Date'[Date] ),
        FILTER (
            'Test_Date',
            'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
        )
    )
VAR _maxdate =
    CALCULATE (
        MAX ( 'Test_Date'[Date] ),
        FILTER (
            'Test_Date',
            'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
        )
    )
RETURN
    IF (
        _minmonth = _maxmonth,
        'Test_Date'[MonthCaption],
        IF ( _weekday < 4, FORMAT ( _maxdate, "mmm" ), FORMAT ( _mindate, "mmm" ) )
    )

yingyinr_0-1618569064185.png

Saludos

View solution in original post

3 REPLIES 3
Syndicate_Admin
Administrator
Administrator

Ahí @Roy_tap,

Puede crear dos columnas calculadas como se indica a continuación para obtener el nombre actualizado del mes, busque los datos adjuntos para los detalles.

1. Crear campo de lunes a viernes

Weekday = WEEKDAY('Test_Date'[Date],2)

2. Cree otra columna calculada para obtener el nombre actualizado del mes

New Month =
VAR _minmonth =
    MONTH (
        CALCULATE (
            MIN ( 'Test_Date'[Date] ),
            FILTER (
                'Test_Date',
                'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                    && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
            )
        )
    )
VAR _maxmonth =
    MONTH (
        CALCULATE (
            MAX ( 'Test_Date'[Date] ),
            FILTER (
                'Test_Date',
                'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                    && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
            )
        )
    )
VAR _weekday =
    CALCULATE (
        MIN ( 'Test_Date'[Weekday] ),
        FILTER (
            'Test_Date',
            'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
                && DAY ( 'Test_Date'[Date] ) = 1
        )
    )
VAR _mindate =
    CALCULATE (
        MIN ( 'Test_Date'[Date] ),
        FILTER (
            'Test_Date',
            'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
        )
    )
VAR _maxdate =
    CALCULATE (
        MAX ( 'Test_Date'[Date] ),
        FILTER (
            'Test_Date',
            'Test_Date'[Year] = EARLIER ( 'Test_Date'[Year] )
                && 'Test_Date'[WeekName] = EARLIER ( 'Test_Date'[WeekName] )
        )
    )
RETURN
    IF (
        _minmonth = _maxmonth,
        'Test_Date'[MonthCaption],
        IF ( _weekday < 4, FORMAT ( _maxdate, "mmm" ), FORMAT ( _mindate, "mmm" ) )
    )

yingyinr_0-1618569064185.png

Saludos

gracias.... muy bien hecho medida que es exactamente lo que necesito. 😊

Syndicate_Admin
Administrator
Administrator

@Roy_tap, dos maneras de tratar en función de lo que tengo, basado en el inicio o el final de la semana

Fecha de inicio de la semana = 'Fecha'[Fecha]+-1*DÍA DE LA SEMANA('Fecha'[Fecha],2)+1
Fecha de finalización de la semana = 'Fecha'[Fecha]+ 7-1*DÍA DE LA SEMANA ('Fecha'[Fecha],2)

Mes final = eomonth([fecha],0)

Fin de mes nuevo = if([Fecha de inicio de la semana]<= eomonth([Date],-1)+1 && [Fecha de finalización de la semana] >=eomonth([date],-1),eomonth([date],-1),eomonth([date],0))

Esto extenderá el fin de mes

o

Semana del mes del cambio

Mes de inicio = STARTOMONTH('Fecha'[Fecha])
Día de la semana = DÍA DE LA SEMANA ([Fecha],2) //lunes
Inicio de la semana = [Fecha] -[WeekDay]+1 //monday
Semana del mes = QUOTIENT(DATEDIFF(Minx(FILTER('Date',[Inicio del mes]=ANTERIOR([Mes de inicio])),'Fecha'[Inicio de la semana]),[Fecha],DÍA),7)+1

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.