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
FbBrnr
Frequent Visitor

Calcular suma del mes sabiendo la semana del año

Hola
Tengo un escenario muy simple en el que no he encontrado una solución :
Tengo una tabla de calendario común

Calendario:
Calendario[fecha]
Calendario[YearWeekNumber]
Calendario[YearMonthNumber]

y algunos pedidos con la siguiente tabla

Comando:
Pedido[fecha]
Pedido[YearWeekNumber]
Order[YearMonthNumber]
Comando[Precio]

The user with the filter can select the Calendario[YearWeekNumber]
to compute the Sum of Comando[Precio] for the selected week. I wanted to compute on the same screen the sum of the orders for the entire month too. I made the measure below :

MonthOrders = CALCULATE(Sum(Commande[Price]),DATESMTD(ENDOFMONTH('Calendar'[Date])))

El valor de MonthOrders está bien si todos los días de la semana seleccionado están en el mismo mes.
Pero el resultado es erróneo si los días de la semana seleccionada se dividen entre un mes y el siguiente.

¿Puedes ayudarme a hacer un buen cálculo para esto?

Gracias por tu ayuda.
saludos.

4 ACCEPTED SOLUTIONS

[Month Order Total] =
// This must work for any selection
// of weeks, not only one.
SUMX(
    // Go over all the weeks
    // in the current context. Please note
    // that YearWeekNumber must be unique
    // across all years. If this number
    // does not uniquely identify the week
    // in the whole Calendar, please use
    // a field that does instead.
    DISTINCT( 'Calendar'[YearWeekNumber] ),
    // If the currently iterated-over
    // week is not fully contained in
    // just one month, then get the
    // first month that has a non-empty
    // intersection with the week.
    CALCULATE(
        // UniqueMonthID must be the unique identifier
        // of the month across all the years and it
        // must be increasing, so, for instance,
        // Jan 2019 must have a different id from
        // Jan 2020.
        var __firstMonth =
            MIN( 'Calendar'[UniqueMonthID] )
        var __total =
            CALCULATE(
                SUM( 'Commande'[Price] ),
                'Calendar'[UniqueMonthID] = __firstMonth,
                ALL( 'Calendar' )
            )
        return
            __total,
        
        ALLEXCEPT(
            'Calendar',
            'Calendar'[YearWeekNumber]
        )
    )
)

View solution in original post

Hola @daxer todopoderoso,

Su solución se ve muy bien, no conocía este tipo de sintaxis con la definición de variables "sobre la marcha" durante la función CALCULATE. Lo implementé. El resultado es correcto cuando filtro la página con un número de semana (o varios como usted dijo) procedente de la tabla Calendario, pero me obligo a presentar una larga lista de todas las semanas del calendario al usuario.
Si trato de filtrar por el número de la semana que viene del Comando, entonces el resultado siempre está en blanco. ¿Hay una buena razón para esto?
Gracias por tu ayuda.
saludos

View solution in original post

NUNCA debe usar un campo que provend directamente de una tabla de hechos. Las tablas de hechos deben estar ocultas o, si tiene medidas en ellas, todas sus columnas deben estar ocultas. El corte sólo debe ser posible a través de dimensiones. Siempre. Hazlo de otra manera y estarás condenado. Si desea presentar sólo las semanas que existen en su tabla de hechos, hay muchas mejores maneras de hacerlo. Las entradas de una segmentación de datos también se pueden filtrar por cualquier medida que desee. Sólo tiene que utilizar el panel de filtros.

Una última cosa... la tabla de hechos solo debe contener claves de dimensiones y números (medidas en bruto). Nada más. Hazlo de una manera diferente y sentirás el calor en poco tiempo.

View solution in original post

v-rzhou-msft
Community Support
Community Support

Hola @FbBrnr

Usted puede tratar de manera así, yo construyo esta medida por función if.

Measure = 
VAR _sel =
    SELECTEDVALUE ( 'Calendar'[YearWeekNumber] )
VAR _count =
    CALCULATE (
        DISTINCTCOUNT ( Commande[YearMonthNumber] ),
        FILTER ( Commande, Commande[YearWeekNumber] = _sel )
    )
VAR _MinxMon =
    MINX (
        FILTER ( Commande, Commande[YearWeekNumber] = _sel ),
        Commande[YearMonthNumber]
    )
VAR _A =
    SUMX ( FILTER ( Commande, Commande[YearWeekNumber] = _sel ), Commande[Price] )
VAR _B =
    SUMX (
        FILTER (
            Commande,
            Commande[YearWeekNumber] = _sel
                && Commande[YearMonthNumber] = _MinxMon
        ),
        Commande[Price]
    )
RETURN
    IF ( _count = 1, _A, _B )

_Count es el descuento de las filas cuando filtramos por nuestra segmentación de datos, Si COUNT 1, mostrar _A (la respuesta normal), si CUENTA n.o 2 , mostrar you_B (La suma del precio mínimo del mes).

Y si desea usar esta medida, puede crear una segmentación de datos por YearWeekNumber Column en la tabla Calendar. (Debido a que usamos Commande[YearWeekNumber] - _sel en nuestra medida)

Puede descargar el archivo pbix desde este enlace: Calcular suma del mes sabiendo la semana del año

Saludos

Rico Zhou

Si este post ayuda,entonces considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

View solution in original post

7 REPLIES 7
v-rzhou-msft
Community Support
Community Support

Hola @FbBrnr

Usted puede tratar de manera así, yo construyo esta medida por función if.

Measure = 
VAR _sel =
    SELECTEDVALUE ( 'Calendar'[YearWeekNumber] )
VAR _count =
    CALCULATE (
        DISTINCTCOUNT ( Commande[YearMonthNumber] ),
        FILTER ( Commande, Commande[YearWeekNumber] = _sel )
    )
VAR _MinxMon =
    MINX (
        FILTER ( Commande, Commande[YearWeekNumber] = _sel ),
        Commande[YearMonthNumber]
    )
VAR _A =
    SUMX ( FILTER ( Commande, Commande[YearWeekNumber] = _sel ), Commande[Price] )
VAR _B =
    SUMX (
        FILTER (
            Commande,
            Commande[YearWeekNumber] = _sel
                && Commande[YearMonthNumber] = _MinxMon
        ),
        Commande[Price]
    )
RETURN
    IF ( _count = 1, _A, _B )

_Count es el descuento de las filas cuando filtramos por nuestra segmentación de datos, Si COUNT 1, mostrar _A (la respuesta normal), si CUENTA n.o 2 , mostrar you_B (La suma del precio mínimo del mes).

Y si desea usar esta medida, puede crear una segmentación de datos por YearWeekNumber Column en la tabla Calendar. (Debido a que usamos Commande[YearWeekNumber] - _sel en nuestra medida)

Puede descargar el archivo pbix desde este enlace: Calcular suma del mes sabiendo la semana del año

Saludos

Rico Zhou

Si este post ayuda,entonces considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

themistoklis
Community Champion
Community Champion

@FbBrnr Si los días de la semana se dividen entre 2 meses, ¿qué desea que devuelva la fórmula? (¿qué valores del mes?)

Hola @themistoklis,

Por ejemplo, si la semana se divide entre marzo y abril, necesito el importe total de los pedidos de marzo.
Gracias por tu ayuda.
saludos.

[Month Order Total] =
// This must work for any selection
// of weeks, not only one.
SUMX(
    // Go over all the weeks
    // in the current context. Please note
    // that YearWeekNumber must be unique
    // across all years. If this number
    // does not uniquely identify the week
    // in the whole Calendar, please use
    // a field that does instead.
    DISTINCT( 'Calendar'[YearWeekNumber] ),
    // If the currently iterated-over
    // week is not fully contained in
    // just one month, then get the
    // first month that has a non-empty
    // intersection with the week.
    CALCULATE(
        // UniqueMonthID must be the unique identifier
        // of the month across all the years and it
        // must be increasing, so, for instance,
        // Jan 2019 must have a different id from
        // Jan 2020.
        var __firstMonth =
            MIN( 'Calendar'[UniqueMonthID] )
        var __total =
            CALCULATE(
                SUM( 'Commande'[Price] ),
                'Calendar'[UniqueMonthID] = __firstMonth,
                ALL( 'Calendar' )
            )
        return
            __total,
        
        ALLEXCEPT(
            'Calendar',
            'Calendar'[YearWeekNumber]
        )
    )
)

Hola @daxer todopoderoso,

Su solución se ve muy bien, no conocía este tipo de sintaxis con la definición de variables "sobre la marcha" durante la función CALCULATE. Lo implementé. El resultado es correcto cuando filtro la página con un número de semana (o varios como usted dijo) procedente de la tabla Calendario, pero me obligo a presentar una larga lista de todas las semanas del calendario al usuario.
Si trato de filtrar por el número de la semana que viene del Comando, entonces el resultado siempre está en blanco. ¿Hay una buena razón para esto?
Gracias por tu ayuda.
saludos

NUNCA debe usar un campo que provend directamente de una tabla de hechos. Las tablas de hechos deben estar ocultas o, si tiene medidas en ellas, todas sus columnas deben estar ocultas. El corte sólo debe ser posible a través de dimensiones. Siempre. Hazlo de otra manera y estarás condenado. Si desea presentar sólo las semanas que existen en su tabla de hechos, hay muchas mejores maneras de hacerlo. Las entradas de una segmentación de datos también se pueden filtrar por cualquier medida que desee. Sólo tiene que utilizar el panel de filtros.

Una última cosa... la tabla de hechos solo debe contener claves de dimensiones y números (medidas en bruto). Nada más. Hazlo de una manera diferente y sentirás el calor en poco tiempo.

HOLA @daxer todopoderoso

Necesito cambiar mi modelo para usar una tabla Objectif no por mes, sino por día.
Así que ahora la tabla Objectif se ve como:

Objectif:
[fecha]
[Objetivo]
¿Qué necesito cambiar en la solución anterior para recuperar el objetivo del mes? Porque ahora la solución a continuación me dan todo el objetivo del año:

Objetivo del mes
DISTINCT( 'Calendario'[Año] ),
CALCULATE(
fue __firstMonth ?
MIN( 'Calendario'[YearMonthnumber] )
fue __total ?
CALCULATE(
SUM (Objetivo),
'Calendario'[YearMonthnumber] á __firstMonth,
ALL( 'Calendario' )
)
devolución
__total,
ALLEXCEPT(
'Calendario',
'Calendario'[YearWeekNumber]
)
)
)

Gracias por tu ayuda

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.

Top Solution Authors