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.
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.
Solved! Go to Solution.
[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 @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.
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.
@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:
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
2 | |
2 | |
2 | |
2 | |
1 |