Número de ventas por día de la semana según el día de venta y el día de envío

En este escenario partimos de una tabla de ventas, Sales, en la que se incluye un campo con la referencia del día de la orden de venta, OrderDateKey, y otro con la referencia del día del envío del producto, ShipDateKey. Hay, por supuesto, una tabla conteniendo el calendario, Calendar en la que se especifica el día de la semana de cada fecha en el campo DayName. Entre ambas tablas, Sales y Calendar, existe una relación de tipo muchos a uno entre los campos OrderDateKey DateKey, respectivamente.

El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.

Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo 'Calendar'[DayName] (a ambas tablas) y los campos OrderDateKey y ShipDateKey de la tabla Sales (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:

Visualizaciones con el número de ventas y envíos por día de la semana

Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos Sales[OrderDateKey] y Calendar[DateKey]- por lo que, con independencia del campo del que partamos en la tabla Sales (OrderDateKey o ShipDateKey), el registro de destino en la tabla Calendar es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.

Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos Sales[OrderDate] y Calendar[DateKey]. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos Sales[ShipDateKey]Calendar[DateKey].

Creamos, por lo tanto, esta segunda relación entre las tablas Sales y Calendar. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:

Segunda relación entre las tablas de ventas y el calendario

Vamos a generar a continuación las dos tablas utilizando la función SUMMARIZE, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto Calendar[DayName]. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:

Tabla intermedia = SUMMARIZE(

    Sales;

    'Calendar'[DayName];

    "Number of orders"; COUNT(Sales[OrderDateKey])

);

Es decir, estaríamos generando una tabla a partir de la tabla Sales, agrupando los resultados por los valores del campo remoto 'Calendar'[DayName] y totalizando el campo Sales[OrderDateKey] contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre Number of orders.

Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función USERELATIONSHIP. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función CALCULATETABLE para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:

Tabla final = CALCULATETABLE(

    Tabla intermedia;

    USERELATIONSHIP(relación-a-usar)

)

El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:

Number of order dates per day of week =

    CALCULATETABLE(

        SUMMARIZE(

        Sales;

        'Calendar'[DayName];

        "Number of order dates"; COUNT(Sales[OrderDateKey])

    );

    USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])

)

La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:

Number of ship dates per day of week =

    CALCULATETABLE(

        SUMMARIZE(

        Sales;

        'Calendar'[DayName];

        "Number of ship dates"; COUNT(Sales[ShipDateKey])

        );

        USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])

    )

En esta segunda versión, la única diferencia es el origen de la relación a usar: Sales[ShipDateKey] en lugar del campo por defecto Sales[OrderDateKey].

Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:

Número de órdenes de venta por día de la semana

Y para la segunda sería el siguiente:

Número de envíos por día de la semana

Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.

Funciones DAX involucradas
Enviado por admin el Dom, 06/01/2019 - 17:17