jueves, 22 de septiembre de 2022

Power Pivot: Tablas como VAR

Hoy veremos como en Power Pivot-DAX podemos asignar tablas como variables, y cómo trabajar con dichas tablas.

Tiempo atrás publiqué algunos conceptos importantes sobre la definición de variables (con VAR) que deberías releer ;-)

En la entrada de hoy veremos un par de ejemplos de cómo conseguir crear nuestras 'tablas temporales' (cargadas como variables), y trabajar sobre ellas como con 'cualquier otra tabla física' (con las limitaciones que en sí conlleva este método.).

Partiremos de un conjunto de tres tablas en una hoja de cálculo ('TblDATOS','TblPRECIOS' y 'TblDESC'). Tablas que habremos cargado al Modelo de datos (desde la Ficha Power Pivot > botón Agregar al modelo de datos).
Para a continuación relacionar entre sí, desde la ventana de Vista de diagrama ya dentro del Editor de Power Pivot:
Power Pivot: Tablas como VAR

Fundamental siempre definir las relaciones existentes correctamente!!.

Crearemos a continuación algunos ejemplos similares donde conseguimos segmentar y calcular únicamente las ventas brutas del vendedor 'JUAN' a los clientes definidos como 'VIP'.
Hasta llegar a un informe de tabla dinámica como el que sigue:
Power Pivot: Tablas como VAR


Primer ejemplo. Añadimos una medida con la siguiente fórmula:
 PrimerIntento:=
VAR filtroVIP_Juan=FILTER(TblDATOS;TblDATOS[Tipo venta]="VIP" && TblDATOS[Vendedor]="Juan" )
RETURN
SUMX(filtroVIP_Juan; [Unidades vendidas]*RELATED(TblPRECIOS[precio]))

Power Pivot: Tablas como VAR


En la primera asignación de variable 'filtroVIP_Juan' con VAR, cargamos la tabla devuelta con FILTER. Esta función nos devuelve como resultado una tabla completa, con las filas resultantes de aplicar el filtro sencillo o múltiple.
Posteriormente iteramos con SUMX las filas de nuestra 'tabla temporal', multiplicando las Unidades por sus precios relacionados, acumulando dicho producto.

Un caso sencillo 👍

Vamos con un segundo ejemplo un poco más elaborado...
Creamos una nueva medida con la fórmula:
testVAR:=
VAR filtroVIP_Juan=FILTER(TblDATOS;TblDATOS[Tipo venta]="VIP" && TblDATOS[Vendedor]="Juan")	--22405 reg
VAR FIN=NATURALINNERJOIN(filtroVIP_Juan;TblPRECIOS)		--22405 reg

VAR Vtas_EUR=SUMX(FIN;[Unidades vendidas]*[precio])		--recorremos las 22405 filas
RETURN
Vtas_EUR

Power Pivot: Tablas como VAR

Analicemos la fórmula.
La primera asignación de variable 'filtroVIP_Juan' con VAR cumple las mismas expectativas que el caso anterior...
En este caso, hacemos uso de la tabla temporal para con la función NATURALINNERJOIN, obtener una nueva tabla.
VAR FIN=NATURALINNERJOIN(filtroVIP_Juan;TblPRECIOS)
NATURALINNERJOIN que devuelve una nueva tabla resultante de'combinar' la primera (tabla izquierda) con la segunda (tabla derecha), incluyendo solo filas para las cuales los valores en las columnas comunes especificadas están presentes en ambas tablas.
La tabla devuelta tendrá las columnas comunes de la tabla de la izquierda y otras columnas de ambas tablas.
Obtenemos una tabla con las columnas necesarias para aplicar el siguiente cálculo:
VAR Vtas_EUR=SUMX(FIN;[Unidades vendidas]*[precio])
donde de nuevo hacemos referencia a una tabla temporal... y como expresión, que itera por esa 'tabla', utilizamos campos de ésta!!.

Último ejemplo, con el mismo objetivo de cálculo.
Nueva medida con fórmula:
TESTvar3:=VAR filtroVIP_Juan=FILTER(TblDATOS;TblDATOS[Tipo venta]="VIP" && TblDATOS[Vendedor]="Juan")		--22405 reg
VAR tbl=SUMMARIZE(filtroVIP_Juan;  TblDATOS[artículo];TblPRECIOS[precio])	--10 reg
VAR Vtas_EUR=SUMX(tbl;
			SUMX(CALCULATETABLE(TblDATOS;TblDATOS[Tipo venta]="VIP" ; TblDATOS[Vendedor]="Juan");
			TblDATOS[Unidades vendidas]*tblPRECIOS[precio]))
//22405 x 10 = 224.050 iteraciones/cálculos
RETURN
	Vtas_EUR

Power Pivot: Tablas como VAR


Otros dos intentos más con medidas...
Otro1:=VAR filtroVIP_Juan=FILTER(TblDATOS;TblDATOS[Tipo venta]="VIP" && TblDATOS[Vendedor]="Juan" )
RETURN
SUMX(filtroVIP_Juan; [Unidades vendidas]*RELATED(TblPRECIOS[precio]))


Otro2:=VAR filtroVIP_Juan=CALCULATETABLE(TblDATOS;TblDATOS[Tipo venta]="VIP" ; TblDATOS[Vendedor]="Juan")	--22405 reg
RETURN
SUMX(ADDCOLUMNS(filtroVIP_Juan; "Precio"; RELATED(TblPRECIOS[precio]));
			[unidades vendidas]*[Precio])


Como se puede comprobar, la versatilidad de esta tablas temporales es muy alta.. pero OJO!!!, no siempre podrás utilizarlas...
Funciones como ALL, ALLEXCEPT, ... requieren de 'tablas reales-existentes' para su correcto funcionamiento.

Un ejemplo de asignación de tabla como variable fallido:
Fallido:=VAR tbl=FILTER(TblDATOS; TblDATOS[Tipo venta]="VIP")
VAR FIN = CALCULATE([Valor_Eur]; ALLEXCEPT(tbl; tbl[Vendedor]))
//VAR FIN2=CALCULATE([Valor_Eur];ALLEXCEPT(TblDATOS;TblDATOS[Tipo venta]))	--sí funciona al usar Tablas existentes
RETURN
FIN


No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.