USERELATIONSHIP https://interactivechaos.ovh/es es Número de ventas por día de la semana según el día de venta y el día de envío https://interactivechaos.ovh/es/dax/scenario/numero-de-ventas-por-dia-de-la-semana-segun-el-dia-de-venta-y-el-dia-de-envio <span class="field field--name-title field--type-string field--label-hidden">Número de ventas por día de la semana según el día de venta y el día de envío</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Dom, 06/01/2019 - 17:17</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.</p> <p>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.</p> <p>Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:</p> <img alt="Visualizaciones con el número de ventas y envíos por día de la semana" data-entity-type="file" data-entity-uuid="f128504b-25ee-439e-b5e9-54ad261050fe" src="/sites/default/files/inline-images/dax_scenario_ventas_por_dia_semana_01.jpg" class="align-center" width="566" height="267" loading="lazy" /><p>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 <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.</p> <p>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 <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. 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 <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em></p> <p>Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. 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:</p> <img alt="Segunda relación entre las tablas de ventas y el calendario" data-entity-type="file" data-entity-uuid="98de9281-933c-4b25-9406-4c1639992fd0" src="/sites/default/files/inline-images/dax_scenario_ventas_por_dia_semana_02.jpg" class="align-center" width="742" height="479" loading="lazy" /><p>Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, 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 <em>Calendar[DayName]</em>. 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:</p> <div class="codigo"> <p>Tabla intermedia = SUMMARIZE(</p> <p>    Sales;</p> <p>    'Calendar'[DayName];</p> <p>    "Number of orders"; COUNT(Sales[OrderDateKey])</p> <p>);</p> </div> <p>Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.</p> <p>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 <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:</p> <div class="codigo"> <p>Tabla final = CALCULATETABLE(</p> <p>    Tabla intermedia;</p> <p>    USERELATIONSHIP(relación-a-usar)</p> <p>)</p> </div> <p>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:</p> <div class="codigo"> <p>Number of order dates per day of week =</p> <p>    CALCULATETABLE(</p> <p>        SUMMARIZE(</p> <p>        Sales;</p> <p>        'Calendar'[DayName];</p> <p>        "Number of order dates"; COUNT(Sales[OrderDateKey])</p> <p>    );</p> <p>    USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])</p> <p>)</p> </div> <p>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:</p> <div class="codigo"> <p>Number of ship dates per day of week =</p> <p>    CALCULATETABLE(</p> <p>        SUMMARIZE(</p> <p>        Sales;</p> <p>        'Calendar'[DayName];</p> <p>        "Number of ship dates"; COUNT(Sales[ShipDateKey])</p> <p>        );</p> <p>        USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])</p> <p>    )</p> </div> <p>En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.</p> <p>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:</p> <img alt="Número de órdenes de venta por día de la semana" data-entity-type="file" data-entity-uuid="b1a04b30-5291-4893-a67e-f63ba97d58c6" src="/sites/default/files/inline-images/dax_scenario_ventas_por_dia_semana_03.jpg" class="align-center" width="463" height="463" loading="lazy" /><p>Y para la segunda sería el siguiente:</p> <img alt="Número de envíos por día de la semana" data-entity-type="file" data-entity-uuid="34c3d0ca-e85c-43ef-98b7-7a614efafe4e" src="/sites/default/files/inline-images/dax_scenario_ventas_por_dia_semana_04.jpg" class="align-center" width="468" height="466" loading="lazy" /><p>Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.</p> </div> <div class="field field--name-field-funciones-dax-involucradas field--type-entity-reference field--label-above"> <div class="field__label">Funciones DAX involucradas</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/term/51" hreflang="es">SUMMARIZE</a></div> <div class="field__item"><a href="/es/taxonomy/term/52" hreflang="es">COUNT</a></div> <div class="field__item"><a href="/es/taxonomy/term/53" hreflang="es">CALCULATETABLE</a></div> <div class="field__item"><a href="/es/taxonomy/term/54" hreflang="es">USERELATIONSHIP</a></div> </div> </div> Sun, 06 Jan 2019 16:17:08 +0000 admin 351 at https://interactivechaos.ovh