Saldos de cierre y apertura de DAX

Un usuario Pregunto ✅

JTwohig

Tengo una tabla que contiene una instantánea diaria de una cantidad. Puedo obtener la cantidad al final de cada mes con esta fórmula:

Saldo final: = CALCULATE (Sum (FactTable[AmountToDate]), LASTDATE (FactTable[Date]))

Necesito el saldo al final del mes anterior para poder restar y obtener el cambio en el mes. Probé la siguiente fórmula:

Cierre del último mes: = CALCULATE ([Closing Balance], PREVIOUSMONTH (LASTDATE (FactTable[Date])))

Esto me da el saldo de cierre correcto para el último mes del año, pero todos los demás meses están en blanco. Los resultados se muestran a continuación. He probado muchas formas diferentes pero siempre obtengo lo mismo. ¿Qué me estoy perdiendo?

Valores
Año del calendario MonthName Balance de cierre Cierre del mes pasado
2016 marcha 59.791.699,31
abril 62.596.269,14
Mayo 51.852.607,79
junio 53.945.802,67
julio 53.729.133,16
agosto 57.174.277,35
septiembre 56,780,543.07
octubre 57.852.783,08
noviembre 55.973.021,78
diciembre 57.976.571,96
Total 2016 57.976.571,96 55.973.021,78
2017 enero 55.479.645,44
febrero 50.214.362,52
marcha 44.361.759,05
abril 46.053.405,57
Mayo 48.841.553,83
junio 52.345.876,41
julio 56.329.590,12
agosto 55.859.204,39
Total 2017 55.859.204,39 56.329.590,12
Gran total 55.859.204,39

56.329.590,12

Vvelarde

En respuesta a JTwohig

@JTwohig

Hola, si siempre terminaste a fin de mes. esto puede ayudarte

ClosingBalance-1month-Alt =
VAR EndofPrevMonth =
    PREVIOUSMONTH ( Table1[Date] )
RETURN
    CALCULATE (
        SUM ( Table1[Amount] ),
        FILTER ( ALL ( Table1 ), Table1[Date] = EndofPrevMonth )
    )

También puede revisar estas funciones de DAX:

APERTURA BALANCE MES

MES DE CLAUSURA

Saludos

Víctor

Lima, Perú

fhill

En respuesta a JTwohig

¡¡¡¡FINALMENTE!!!! Lo tengo … ¡Este enlace ayudó!

https://community.powerbi.com/t5/Desktop/Help-using-Earlier-in-New-Measure/td-p/55799

EndofPriorMonth = CALCULATE (SUM (Table1[Balance]), FILTRO (TODOS (Tabla1), SUMX (FILTRO (Tabla1, ANTERIORES (Tabla1)[Date]) = ÚLTIMA FECHA (ANTERIORMES (Tabla1[Date])) ), Tabla 1[Balance])))

** Qué hace esto … .Sum Blance,

Mire TODAS las filas, (Filtrar TODAS)

SUMX (Sumas para cada fila de ….)

Filtrar de nuevo (no estoy seguro de por qué)

Compare la ‘fila anterior’ (ANTES) con la última fecha del mes anterior

Cuando lo encuentre, devuelva el saldo.

EndOfMonth = CALCULATE (SUM (Table1[Balance]), ENDOFMONTH (Tabla1[Date]))

Cambiar = [EndOfMonth] – [EndofPriorMonth]

Capture.PNG

JTwohig

Pensé que publicaría esto en caso de que alguien más esté tratando de hacer lo mismo que yo.

Aquí se sugirieron dos soluciones que funcionaron cuando miré toda la tabla. Sin embargo, cuando traté de filtrar los resultados por cliente o alguna otra dimensión, el saldo de cierre del último mes seguía siendo el saldo del último mes para todo. No fue filtrado.

Lo que funcionó fue eliminar solo el filtro de la fecha en lugar de toda la tabla. Si entiendo la terminología, eso significa que mantiene el contexto para todo lo demás, pero no para las fechas.

en lugar de usar FILTER (All (FactTable),

Usé Filter (All (FactTable[CalendarYear], FactTable[MonthName], FactTable[Date]),

De esa manera obtuve los equilibrios correctos, ya sea que mirara toda la tabla o solo mirara ciertas dimensiones.

nickchobotar

En respuesta a JTwohig

@JTwohig

Antes de que se cierre esta publicación. ¿Qué pasa si usas FILTRO (ALLSELECTED (FactTable)) en lugar de

Filter (All (FactTable[CalendarYear], FactTable[MonthName], FactTable[Date]),?

Además, considere agregar una dimensión de fecha a su modelo.

JTwohig

En respuesta a nickchobotar

Eso funcionó también. Me gusta mucho más porque es más sencillo. Gracias.

Tengo una dimensión de fecha, junto con varias otras. Mi modelo usa datos de dos tablas de hechos, por lo que la única forma de obtener los datos correctos de cada tabla de hechos es usar dimensiones separadas.

nickchobotar

En respuesta a JTwohig

Hola @JTwohig

¡Excelente! Me alegra escuchar el TODOS SELECCIONADOS () funcionó para usted.

Si te entendí correctamente, estás usando dos dimensiones separadas que juegan el mismo papel para filtrar tus dos tablas de hechos. Si es así, hay un espacio para optimizar su modelo para que pueda usar solo una dimensión de Fecha. Si está interesado, publique una imagen del diagrama de su modelo.

NORTE-

JTwohig

En respuesta a nickchobotar

No, son dimensiones diferentes. Tengo una dimensión de fecha más unas para cliente, proyecto y unidad de negocio.

nickchobotar

En respuesta a JTwohig

@JTwohig

Veo. En ese caso, ¿cómo es que no está usando su dimensión Fecha para este cálculo de tiempo, sino que usa su tabla de hechos?

JTwohig

En respuesta a nickchobotar

Utilizo la dimensión de fecha para los cálculos, pero cuando publiqué el ejemplo, estaba solucionando problemas y eliminé todas las demás tablas para tratar de simplificar tanto como sea posible. Quería estar seguro de que el problema no provenía de una combinación incorrecta. También simplifiqué el cálculo. Realmente no estoy obteniendo solo un saldo inicial. Estoy haciendo cálculos con varios saldos de apertura y cierre.

Cuando soluciono problemas, me gusta llegar a la situación más simple posible en la que obtengo el error para identificar exactamente qué está fallando.

Todo finalmente funcionó bien. Implementé el modelo en SSAS, creé mi informe de Power BI y lo publiqué en un elemento web en SharePoint. Se actualiza desde una base de datos de SQL Server todas las noches.

nickchobotar

En respuesta a JTwohig

@JTwohig

¡Excelente! Ahora está claro. Marque esta publicación como resuelta.

N –

nickchobotar

@JTwohig

Estabas en el camino correcto con tu fórmula de cierre del último mes. Solo necesita tener su LASTDATE () al frente porque PREVIOUSMONTH () nos da una SUMA de todo el mes y con LASTDATE () filtra hasta la última fecha del mes. Usar LASTDATE en una variable aquí es una exageración, creo.

Closing Blance Prev Month = 
CALCULATE(
	[Sales Amount],
	LASTDATE(PREVIOUSMONTH('Date'[Date]))
)

Nick –

JTwohig

En respuesta a nickchobotar

Mella

Eso no funcionó para mí. Lo cambié a Sum ([Sales Amount]) porque decía que no se podía determinar un solo valor. Sin embargo, incluso entonces, me dio espacios en blanco para todos los meses.

No entiendo por qué, pero, incluso cuando lo intenté de varias maneras diferentes, parece haber algo en el uso de la variable que lo hace funcionar.

nickchobotar

En respuesta a JTwohig

@JTwohig

Lo mas Lo importante es que tenga una solución que funcione.

Veo que solo hace referencia a una tabla (Tabla1) tanto para fechas como para hechos, lo que me hace suponer que no está utilizando una dimensión de Fecha separada, por eso mi solución no funcionó para usted. Mi recomendación sería incluir una dimensión de fecha, ya que está haciendo cosas de inteligencia de tiempo.

NORTE-

JTwohig

En respuesta a nickchobotar

Estás en lo correcto. Tengo una dimensión de fecha separada, pero lo puse todo en una tabla mientras soluciono problemas para intentar hacerlo lo más simple posible.

Gracias

fhill

En respuesta a JTwohig

¡¡¡¡FINALMENTE!!!! Lo tengo … ¡Este enlace ayudó!

https://community.powerbi.com/t5/Desktop/Help-using-Earlier-in-New-Measure/td-p/55799

EndofPriorMonth = CALCULATE (SUM (Table1[Balance]), FILTRO (TODOS (Tabla1), SUMX (FILTRO (Tabla1, ANTERIORES (Tabla1)[Date]) = ÚLTIMA FECHA (ANTERIORMES (Tabla1[Date])) ), Tabla 1[Balance])))

** Qué hace esto … .Sum Blance,

Mire TODAS las filas, (Filtrar TODAS)

SUMX (Sumas para cada fila de ….)

Filtrar de nuevo (no estoy seguro de por qué)

Compare la ‘fila anterior’ (ANTES) con la última fecha del mes anterior

Cuando lo encuentre, devuelva el saldo.

EndOfMonth = CALCULATE (SUM (Table1[Balance]), ENDOFMONTH (Tabla1[Date]))

Cambiar = [EndOfMonth] – [EndofPriorMonth]

Capture.PNG

JTwohig

En respuesta a fhill

Eso también funciona.

Gracias

fhill

¡Power BI / DAX tiene excelentes características para esto! ** Agosto a continuación muestra 7000 dos veces b / c. Todavía no tengo un EOD para AUG en mi tabla, en su lugar, tomará la fecha más alta de ese mes. **

StartofMonth = CALCULATE (SUM (Table1[Balance]), STARTOFMONTH (Tabla1[Date]))

EndOfMonth = CALCULATE (SUM (Table1[Balance]), ENDOFMONTH (Tabla1[Date]))

Cambiar = [EndOfMonth] – [StartofMonth]

Capture.PNG

JTwohig

En respuesta a fhill

Gracias por la sugerencia, pero no está del todo ahí, un día libre.

Necesito saber el cambio de un mes a otro. Su ejemplo muestra que el cambio fue de 5500 en julio, pero en realidad fue de 5600. Aumentó en 100 (de 400 a 500) el 1 de julio.

Me gusta más la función ENDOFMONTH que la que había usado.

No puedo evitar pensar que me falta algo simple al no poder obtener el saldo al final del mes anterior.

Vvelarde

En respuesta a JTwohig

@JTwohig

Hola, si siempre terminaste a fin de mes. esto puede ayudarte

ClosingBalance-1month-Alt =
VAR EndofPrevMonth =
    PREVIOUSMONTH ( Table1[Date] )
RETURN
    CALCULATE (
        SUM ( Table1[Amount] ),
        FILTER ( ALL ( Table1 ), Table1[Date] = EndofPrevMonth )
    )

También puede revisar estas funciones de DAX:

APERTURA BALANCE MES

MES DE CLAUSURA

Saludos

Víctor

Lima, Perú

JTwohig

En respuesta a Vvelarde

Gracias Victor

Tuve que hacer un cambio. Agregué el LASTDATE:

ClosingBalance-1month-Alt = VAR EndofPrevMonth = LASTDATE (PREVIOUSMONTH (Table1[Date] )) RETORNO CALCULAR (SUMA (Tabla1[Amount] ), FILTRO (TODOS (Tabla1), Tabla1[Date] = EndofPrevMonth))

He estado intentando que esto funcione durante un tiempo. Agradezco la ayuda.

fhill

En respuesta a JTwohig

He estado tratando de lanzar un ‘DateAdd (….., – 1, Month) en alguna parte, pero no me gustan los cambios de meses … tendré que probar más por la mañana.

Para descanso

Deja un comentario

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