¿Alguna forma de simplificar este código DAX?

Un usuario Pregunto ✅

olimilo

Days Elapsed = 
	-- Days elapsed since the End Date up to the current date

	VAR Type1 = 
		COUNTROWS(
			FILTER(
				ALL(Dates),
				Dates[Date] >= 'Active Projects'[CompleteByEndDate] &&
				Dates[Date] <= TODAY() &&
				Dates[IsWeekend] = FALSE()
			)
		)
	
	VAR Type2 = 
		COUNTROWS(
			FILTER(
				ALL(Dates),
				Dates[Date] >= 'Active Projects'[CompleteByEndDate] &&
				Dates[Date] <= TODAY() &&
				Dates[IsWeekendType2] = FALSE()
			)
		)

	VAR Type3 = 
		COUNTROWS(
			FILTER(
				ALL(Dates),
				Dates[Date] >= 'Active Projects'[CompleteByEndDate] &&
				Dates[Date] <= TODAY() &&
				Dates[IsWeekendType3] = FALSE()
			)
		)

	VAR Type4 = 
		COUNTROWS(
			FILTER(
				ALL(Dates),
				Dates[Date] >= 'Active Projects'[CompleteByEndDate] &&
				Dates[Date] <= TODAY() &&
				Dates[IsWeekendType4] = FALSE()
			)
		)

	VAR Type5 = 
		COUNTROWS(
			FILTER(
				ALL(Dates),
				Dates[Date] >= 'Active Projects'[CompleteByEndDate] &&
				Dates[Date] <= TODAY() &&
				Dates[IsWeekendType5] = FALSE()
			)
		)

	VAR Type6 = 
		COUNTROWS(
			FILTER(
				ALL(Dates),
				Dates[Date] >= 'Active Projects'[CompleteByEndDate] &&
				Dates[Date] <= TODAY() &&
				Dates[IsWeekendType6] = FALSE()
			)
		)

	VAR Type7 = 
		COUNTROWS(
			FILTER(
				ALL(Dates),
				Dates[Date] >= 'Active Projects'[CompleteByEndDate] &&
				Dates[Date] <= TODAY() &&
				Dates[IsWeekendType7] = FALSE()
			)
		)

	VAR TAT = 
		IF(LOOKUPVALUE(Weekdays[WeekendType], Weekdays[Country], 'Active Projects'[Country]) = 1, Type1,
			IF(LOOKUPVALUE(Weekdays[WeekendType], Weekdays[Country], 'Active Projects'[Country]) = 2, Type2,
				IF(LOOKUPVALUE(Weekdays[WeekendType], Weekdays[Country], 'Active Projects'[Country]) = 2, Type3,
					IF(LOOKUPVALUE(Weekdays[WeekendType], Weekdays[Country], 'Active Projects'[Country]) = 2, Type4,
						IF(LOOKUPVALUE(Weekdays[WeekendType], Weekdays[Country], 'Active Projects'[Country]) = 2, Type5,
							IF(LOOKUPVALUE(Weekdays[WeekendType], Weekdays[Country], 'Active Projects'[Country]) = 2, Type6, Type7)
						)
					)
				)
			)
		)
	
	RETURN SWITCH(
		TRUE(),
		'Active Projects'[CompleteByEndDate] < TODAY(), TAT - 'Active Projects'[Holidays (Elapsed)],
		'Active Projects'[CompleteByEndDate] > TODAY(), -1 * TAT - 'Active Projects'[Holidays (Elapsed)]
	)

Es bastante largo pero hace lo mismo en general, la única diferencia es que usa una columna diferente para el argumento FILTER final basado en la categoría WeekendType del país (por ejemplo: fin de semana sábado/domingo, fin de semana viernes/sábado).

Hola @olimilo

Parece factible. Cualquier posibilidad de que pueda publicar algunos datos ficticios para sus dos tablas para ayudarnos a comprender un poco mejor sus datos.

En respuesta a Phil_Seamark

Ah, y una idea un poco más radical es simplemente simplificar su modelo de datos. Así que gira tus 7 columnas en filas.

Entonces, en lugar de 1 fila con 7 columnas, pivote (o anule el pivote en el Editor de consultas) para que tenga 7 filas y menos columnas. Esto hará que su DAX sea mucho más simple.

olimilo

En respuesta a Phil_Seamark

¡Hola @GilbertQ y @Phil_Seamark!

Esta es la tabla de fechas:

Fecha Día de la semana es fin de semana IsWeekendType2 IsWeekendType3 IsWeekendType4 IsWeekendType5 IsWeekendType6 IsWeekendType7
1/1/2013 martes FALSO FALSO FALSO FALSO FALSO FALSO FALSO
2/1/2013 miércoles FALSO FALSO FALSO FALSO FALSO FALSO FALSO
3/1/2013 jueves FALSO FALSO CIERTO FALSO FALSO FALSO FALSO
4/1/2013 viernes FALSO CIERTO CIERTO CIERTO FALSO CIERTO FALSO
05/01/2013 sábado CIERTO CIERTO FALSO FALSO FALSO FALSO CIERTO
06/01/2013 domingo CIERTO FALSO FALSO CIERTO CIERTO FALSO FALSO
7/1/2013 lunes FALSO FALSO FALSO FALSO FALSO FALSO FALSO
8/1/2013 martes FALSO FALSO FALSO FALSO FALSO FALSO FALSO
9/1/2013 miércoles FALSO FALSO FALSO FALSO FALSO FALSO FALSO
10/01/2013 jueves FALSO FALSO CIERTO FALSO FALSO FALSO FALSO

De hecho, traté de usar una estructura de datos más simple, pero he tenido dificultades para manejar las fechas y los tipos de fin de semana (aquí y aquí). He intentado torcer y girar la estructura de datos, pero esto es lo mejor que pude hacer (y ha sido el que se demuestra con mayor frecuencia como ejemplo al contar rangos de fechas).

En respuesta a olimilo


@olimilo escribió:

¡Hola @GilbertQ y @Phil_Seamark!

Esta es la tabla de fechas:

Fecha Día de la semana es fin de semana IsWeekendType2 IsWeekendType3 IsWeekendType4 IsWeekendType5 IsWeekendType6 IsWeekendType7
1/1/2013 martes FALSO FALSO FALSO FALSO FALSO FALSO FALSO
2/1/2013 miércoles FALSO FALSO FALSO FALSO FALSO FALSO FALSO
3/1/2013 jueves FALSO FALSO CIERTO FALSO FALSO FALSO FALSO
4/1/2013 viernes FALSO CIERTO CIERTO CIERTO FALSO CIERTO FALSO
05/01/2013 sábado CIERTO CIERTO FALSO FALSO FALSO FALSO CIERTO
06/01/2013 domingo CIERTO FALSO FALSO CIERTO CIERTO FALSO FALSO
7/1/2013 lunes FALSO FALSO FALSO FALSO FALSO FALSO FALSO
8/1/2013 martes FALSO FALSO FALSO FALSO FALSO FALSO FALSO
9/1/2013 miércoles FALSO FALSO FALSO FALSO FALSO FALSO FALSO
10/01/2013 jueves FALSO FALSO CIERTO FALSO FALSO FALSO FALSO

De hecho, traté de usar una estructura de datos más simple, pero he tenido dificultades para manejar las fechas y los tipos de fin de semana (aquí y aquí). He intentado torcer y girar la estructura de datos, pero esto es lo mejor que pude hacer (y ha sido el que se demuestra con mayor frecuencia como ejemplo al contar rangos de fechas).


@olimilo

Creo que es posible que no necesites esos tipos de fin de semana. ¿Qué tal una medida como la siguiente? Es posible que necesite una tabla de búsqueda adicional para países y números de días de fin de semana (1-7).

Days Elapsed = 
	-- Days elapsed since the End Date up to the current date

	VAR weekendday1 = WEEKDAY(TODAY()-1) //lookup weekend number from the lookup table
        VAR weekendday2= Weekday(Today())
        VAR TAT = COUNTROWS(
			FILTER(
				ALL(Dates),
				Dates[Date] >= 'Active Projects'[CompleteByEndDate] &&
				Dates[Date] <= TODAY() &&
				WeekDay(Dates[Date])<>weekendday1 &&
                                WeekDay(Dates[Date])<>weekendday2

			)
	RETURN SWITCH(
		TRUE(),
		'Active Projects'[CompleteByEndDate] < TODAY(), TAT - 'Active Projects'[Holidays (Elapsed)],
		'Active Projects'[CompleteByEndDate] > TODAY(), -1 * TAT - 'Active Projects'[Holidays (Elapsed)]
	)

gilbertq

Hola @olimilo

¿Puedo preguntar qué cambia entre cada fecha?[IsWeekendTypeX]?

Deja un comentario

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