DAX: Cómo realizar una suma acumulativa

Un usuario Pregunto ✅

JBeyers

Me preguntaba cómo debo construir un gráfico que se vea como el siguiente:

cómo.JPG

Quiero hacer una suma y mostrarla en todos los meses. No puedo hacer esto con la función «SUMA» o «SUMX», porque si la distribuyera entre todos los meses, la suma se rompería.

¿Alguien tiene una idea?

konstantinos

En respuesta a JBeyers

Primero necesita tener una tabla de fechas separada para realizar cálculos de fechas…

Paso 1: Cree una tabla de fechas -> Vaya a Modelado, haga clic en Nueva tabla -> ingrese Fechas = CALENDARAUTO(). Ahora tiene una tabla de fechas llamada Fechas..-> Nueva columna en esta tabla Mes = MES (Fechas[Date])

3.png

Paso 2: Crea una relación entre tu tabla[Dates] (las nuevas fechas únicas que creó) y Fechas[Date] (la tabla calculada)

2.png

Paso 3: Reescriba su fórmula para Medida = CALCULAR(
SUM(rprtsolarhistorical[Daily Output]);
FILTRAR(
TODO(fechas[Dates]);
fechas[Date]) <= MÁX.(fechas[Date])
)
)

Paso 4: agregue el campo de meses de la nueva tabla Fechas y la «medida»

Espero que esto funcione

greg_deckler

¿Parece que quieres un total acumulativo? ¿Es eso correcto?

http://www.daxpatterns.com/cumulative-total/

JBeyers

En respuesta a greg_deckler

@Greg_Deckler ¡Exactamente!

Probé la fórmula sugerida pero me da el mismo resultado que cuando hago una «SUM» o «SUMX» normal. Mi expresión DAX parece ser correcta, ¿no?

Medida = CALCULAR(
SUM(rprtsolarhistorical[Daily Output]);
FILTRAR(
TODO(rprtsolarhistórico[Timestamps]); rprtsolarhistórico[Timestamps] <= MAX(rprtsolarhistorical[Timestamps])
)
)

Haegi

En respuesta a JBeyers

Sí, tu fórmula parece ser correcta. carita feliz

¿Es posible que se una a una muestra de su conjunto de datos?

Saludos.

JBeyers

En respuesta a Haegi

@Haegi Aquí hay una pequeña muestra de las columnas de interés. ¿Sabes lo que me estoy perdiendo/haciendo mal?

Salida diaria… Marcas de tiempo Dirección del sensor
0 7-2-2015 11:25:00 0x0001

0 2-7-2015 11:25:00 0x0002

100 2-7-2015 11:25:00 0x0003

100 2-7-2015 11:25:00 0x0004

100 2-7-2015 11:25:00 0x0005

0 7-2-2015 11:30:00 0x0001

200 2-7-2015 11:30:00 0x0002

200 2-7-2015 11:30:00 0x0003

200 2-7-2015 11:30:00 0x0004

200 2-7-2015 11:30:00 0x0005

200 7-2-2015 11:35:00 0x0001

konstantinos

En respuesta a JBeyers

No estoy seguro de qué es lo que no funciona, pero supongo que tiene meses en el eje x y una relación entre una tabla de fechas y la columna de marca de tiempo.

Intente convertir la marca de tiempo a «Solo fechas»… si no lo ha hecho desde Fecha/hora no se puede relacionar solo con fechas…

En caso de que necesite tanto la hora como la fecha, también necesita una tabla de tiempo y una columna dividida para solo fechas y solo hora.

editar: noté en su fórmula que usa la marca de tiempo de la misma tabla … Debe tener una tabla de fechas relacionada con su tabla de marcas de tiempo de historial … y usar estas fechas en FILTRO

JBeyers

En respuesta a konstantinos

No estoy del todo seguro de lo que quieres decir, ¿quieres decir que tengo que hacer 2 columnas adicionales?
Uno solo con la fecha y otro solo con la hora -> así:

Salida diaria… Marcas de tiempo Dirección del sensor Horas Fechas
0 7-2-2015 11:25:00 0x0001 11:25:00 2-7-2015

0 2-7-2015 11:25:00 0x0002 11:25:00 2-7-2015

100 2-7-2015 11:25:00 0x0003 11:25:00 2-7-2015

100 2-7-2015 11:25:00 0x0004 11:25:00 2-7-2015

100 2-7-2015 11:25:00 0x0005 11:25:00 2-7-2015

0 7-2-2015 11:30:00 0x0001 11:30:00 2-7-2015

200 2-7-2015 11:30:00 0x0002 11:30:00 2-7-2015

200 2-7-2015 11:30:00 0x0003 11:30:00 2-7-2015

200 2-7-2015 11:30:00 0x0004 11:30:00 2-7-2015

200 2-7-2015 11:30:00 0x0005 11:30:00 2-7-2015

200 7-2-2015 11:35:00 0x0001 11:35:00 2-7-2015

Intenté esto, pero si uso esto en mi expresión DAX, esto no funcionará:

Medida = CALCULAR(
SUM(rprtsolarhistorical[Daily Output]);
FILTRAR(
TODO(rprtsolarhistórico[Dates]);
rprtsolarhistórico[Dates] <= MAX(rprtsolarhistorical[Times])
)
)

¿Qué estoy haciendo mal?

konstantinos

En respuesta a JBeyers

Primero necesita tener una tabla de fechas separada para realizar cálculos de fechas…

Paso 1: Cree una tabla de fechas -> Vaya a Modelado, haga clic en Nueva tabla -> ingrese Fechas = CALENDARAUTO(). Ahora tiene una tabla de fechas llamada Fechas..-> Nueva columna en esta tabla Mes = MES (Fechas[Date])

3.png

Paso 2: Crea una relación entre tu tabla[Dates] (las nuevas fechas únicas que creó) y Fechas[Date] (la tabla calculada)

2.png

Paso 3 : Reescriba su fórmula para Medida = CALCULAR(
SUM(rprtsolarhistorical[Daily Output]);
FILTRAR(
TODO(fechas[Dates]);
fechas[Date]) <= MÁX.(fechas[Date])
)
)

Paso 4: agregue el campo de meses de la nueva tabla Fechas y la «medida»

Espero que esto funcione

elliotdixon

En respuesta a konstantinos

HI @konstantinos parece que tienes razón. También usé la gran respuesta para totales acumulativos en Dax Patterns http://www.daxpatterns.com/cumulative-total/

Pero necesito tener mi acumulación acumulada durante el mismo año. Haga que cada año se superponga a los demás. Para hacer esto, creo que necesito una columna de fecha que calcule qué día del año es (ignorando el año real) en lugar de una fecha real

En este momento estoy recibiendo esto

Temporadas.jpg

Pero quiero que se parezca más a esto.

Temporada 2.jpg

cualquier ayuda que pueda dar sería muy apreciada.

Salud.

konstantinos

En respuesta a elliotdixon

@elliotdixon no estoy seguro de entender… Lo siento… ¿necesitas comparar todos los años en un gráfico? como el año actual, el anterior, etc. o necesita un valor de por vida. ¿Qué tendría en el eje – meses?

elliotdixon

En respuesta a konstantinos

Hola @konstantinos Saludos: quiero mostrar todos los años en el mismo gráfico. Una línea para cada año diferente. El eje es nuestra temporada (solo un año fiscal – 1 de julio al 30 de junio)

Salud.

Haegi

En respuesta a elliotdixon

@elliotdixon

Hola, me enfrenté al mismo caso.

Primero, supongo que tiene una tabla de fechas con la columna Fecha (completa), Año, Mes, etc.

Creé una nueva columna de medida como esta

CumulativeYear = 
CALCULATE(
SUM('Aggregate'[Amount]); 
FILTER(ALL(Dates[Year]); Dates[Year] = MAX(Dates[Year]));  
FILTER(ALL(Dates[Month]); Dates[Month] <= MAX(Dates[Month])))

Uso dos filtros para especificar un contexto particular: para cada año analizas todo el mes.

elliotdixon

En respuesta a Haegi

Hola @Haegi

Gracias por la ayuda. ¿Puedo crear la medida sin errores, pero luego no puedo incluirla en ninguna tabla o gráfico?

obtener un error
«MdxScript(Modelo) (2, 43) Error de cálculo en la medida ‘InvoiceDetail'[CumulativeYear]: La función MAX toma un argumento que se evalúa como números o fechas y no puede funcionar con valores de tipo Cadena».

mi codigo es

CumulativeYear = CALCULATE(SUM(InvoiceDetail[DETAIL_KMS_TOCHARGE]), 
FILTER(ALL(Dates[Year]),Dates[Year] = MAX(Dates[Year])),  
FILTER(ALL(Dates[MonthName]),Dates[MonthName] <= MAX(Dates[MonthName])))

El mismo resultado si elimino los filtros Mes y solo tengo uno en los años.

Haegi

En respuesta a elliotdixon

¡Buen trabajo!

Este error explica que la función MAX no funciona con el valor de cadena.

Supongo que la columna ‘Nombre del mes’ es una cadena como «Enero» o «Febrero», debemos usar un valor entero como 1,2,3,4,5, etc.

para la columna Mes.

Saludos.

konstantinos

En respuesta a elliotdixon

@elliotdixon Un enfoque (tal vez no el mejor, pero no trabajo mucho con fechas fiscales) tal vez

Hasta la fecha fiscal actual = TOTALYTD(SUMA(Ventas[Amount);’Dates'[Date];«6-30») – El último es para especificar el fin de año ( Fiscal )

Hasta la fecha fiscal anterior = CALCULAR ([YTD Current Fiscal];DATEADD(‘Fechas'[Date];-1 AÑO))

2 años antes de YTD = CALCULAR([YTD Current Fiscal];AÑADIRFECHA(‘fechas‘[Date];-2 AÑOS))

De esta manera, puede tener cualquier fecha de año fiscal en el eje y compararlas todas … También puede dividir en Años

eje = año fiscal 2015 mostrará también 2014 y 2013

eje = año fiscal 2013 mostrará también 2012 y 2011

Espero que funcione..

JBeyers

En respuesta a konstantinos

@konstantinos ¡Muchas gracias por el esfuerzo, funcionó! carita feliz

Deja un comentario

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