CALCULATETABLE https://interactivechaos.ovh/es es Cálculo de las ventas totales del país al que pertenece cada ciudad https://interactivechaos.ovh/es/dax/scenario/calculo-de-las-ventas-totales-del-pais-al-que-pertenece-cada-ciudad <span class="field field--name-title field--type-string field--label-hidden">Cálculo de las ventas totales del país al que pertenece cada ciudad</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">Sáb, 06/07/2019 - 13:19</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 lista de localizaciones ("Geography") en la que se incluye el nombre de la ciudad y el país al que pertenece (entre otros datos):</p> <img alt="Tabla de localizaciones" data-entity-type="file" data-entity-uuid="dd443c51-faa1-43f9-b74e-eb5383fa640b" src="/sites/default/files/inline-images/escenario-dax-0067.png" class="align-center" width="396" height="334" loading="lazy" /><p>...y una tabla de ventas ("<em>Movements</em>") en la que se incluye la fecha de venta, la ciudad a la que está asociada y el importe de venta:</p> <img alt="Tabla de ventas" data-entity-type="file" data-entity-uuid="87b6a972-574a-4cd6-8179-06989f49685a" src="/sites/default/files/inline-images/escenario-dax-0068.png" class="align-center" width="356" height="355" loading="lazy" /><p>Ambas tablas están relacionadas por el campo <em>Geography Id</em>:</p> <img alt="Modelo de datos" data-entity-type="file" data-entity-uuid="ac5e74e8-39a6-4d88-9205-b26e9b44abcb" src="/sites/default/files/inline-images/escenario-dax-0069.png" class="align-center" width="493" height="294" loading="lazy" /><p>El objetivo es añadir una columna calculada a la tabla de localizaciones en la que se muestren las ventas totales del país al que corresponde el registro.</p> <p>Al crear la columna calculada se va a recorrer la tabla de localizaciones creándose el contexto de fila correspondiente. Podemos acceder al valor del campo <em>Country</em> usando la función <a href="/dax/function/earlier">EARLIER</a>, de forma que podríamos seleccionar -para cada fila recorrida- el subconjunto de la tabla de localizaciones que incluye ciudades del país en cuestión. Es decir:</p> <div class="codigo"> <p>FILTER(<br />     Geography;<br />     Geography[Country] = EARLIER(Geography[Country])<br /> )</p> </div> <p>...devolvería este subconjunto. A su vez, este subconjunto de ciudades nos permitiría filtrar la tabla de ventas mediante la función <a href="/dax/function/calculatetable">CALCULATETABLE</a>, agregando como filtro el subconjunto anterior:</p> <div class="codigo"> <p>CALCULATETABLE(<br />     Movements;<br />     FILTER(<br />         Geography;<br />         Geography[Country] = EARLIER(Geography[Country])<br />     )<br /> );</p> </div> <p>Por último, no quedaría más que recorrer esta tabla (subconjunto de la tabla de ventas) sumando el campo <em>Sales</em>:</p> <div class="codigo"> <p>Ventas del país = <br />     SUMX(<br />         CALCULATETABLE(<br />             Movements;<br />             FILTER(<br />                 Geography;<br />                 Geography[Country] = EARLIER(Geography[Country])<br />             )<br />         );<br />         Movements[Sales]<br />     )</p> </div> <p>El resultado sería el siguiente:</p> <img alt="Resultado obtenido:" data-entity-type="file" data-entity-uuid="ea3427fa-4d8d-477d-8fbb-c48f5b3f98ef" src="/sites/default/files/inline-images/escenario-dax-0070.png" class="align-center" width="542" height="899" loading="lazy" /><p>Podemos confirmar que las cifras son las correctas llevando a una visualización tipo tabla la lista de países y el campo <em>Sales</em> de la tabla de ventas:</p> <img alt="Ventas por país" data-entity-type="file" data-entity-uuid="697c0c01-cd14-42e5-a082-0cd8d2ee8fee" src="/sites/default/files/inline-images/escenario-dax-0071.png" class="align-center" width="192" height="172" loading="lazy" /><p> </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/61" hreflang="es">SUMX</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/48" hreflang="es">FILTER</a></div> <div class="field__item"><a href="/es/taxonomy/term/89" hreflang="es">EARLIER</a></div> </div> </div> Sat, 06 Jul 2019 11:19:16 +0000 admin 1153 at https://interactivechaos.ovh Listado de solicitudes de soporte atrasadas https://interactivechaos.ovh/es/dax/scenario/listado-de-solicitudes-de-soporte-atrasadas <span class="field field--name-title field--type-string field--label-hidden">Listado de solicitudes de soporte atrasadas</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">Sáb, 13/04/2019 - 11:05</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En este sencillo escenario partimos de una tabla que registra solicitudes de soporte que, simplemente, contiene un identificador de solicitud, una fecha límite de respuesta y un campo en el que se indica si la solicitud fue ya respondida o no:</p> <img alt="Listado de solicitudes de soporte" data-entity-type="file" data-entity-uuid="750f0d0c-46c8-4ccc-a733-8bbc5ef46e19" src="/sites/default/files/inline-images/escenario-dax-0017.PNG" class="align-center" width="346" height="177" loading="lazy" /><p>El objetivo es identificar qué solicitudes no han sido atendidas cuya fecha límite de asistencia haya vencido. Para esto vamos a crear una tabla calculada en la que implementaremos una función cuyo pseudo-código sería el siguiente:</p> <div class="respuesta"> <p>Filtra la tabla de solicitudes<br /> Incluyendo solo aquellas solicitudes no respondidas<br /> Y cuya fecha límite sea anterior a la fecha de hoy</p> </div> <p>Para filtrar la tabla de solicitudes podemos usar la función <a href="/dax/function/calculatetable">CALCULATETABLE</a>, que nos permite modificar el contexto de cálculo añadiendo los filtros que necesitemos, filtros que, además, se aplican de modo simultáneo (es decir, unidos por un operador lógico AND que obliga a que se cumplan todos ellos). Para imponer el filtro que muestre solo las solicitudes no respondidas, aprovechando que el campo <em>Respondida </em>es booleano e incluye el valor TRUE cuando la solicitud ha sido respondida, basta negar dicho campo con la función <a href="/dax/function/not">NOT</a>. Por último, para mostrar solo las solicitudes cuya fecha límite sea anterior a la fecha de hoy utilizaremos la función <a href="/dax/function/today">TODAY</a> que devuelve la fecha actual.</p> <p>El código quedaría de la siguiente forma (supongamos que la fecha devuelta por la función TODAY es 13 de abril de 2019):</p> <div class="codigo"> <p>Solicitudes atrasadas = <br />     CALCULATETABLE(<br />         Solicitudes;<br />         NOT(Solicitudes[Respondida]);<br />         Solicitudes[Fecha límite] &lt; TODAY()<br />     )</p> </div> <img alt="Listado de solicitudes de soporte atrasadas" data-entity-type="file" data-entity-uuid="f8b84cd6-64bf-4ee7-8a07-641132a5cf36" src="/sites/default/files/inline-images/escenario-dax-0018.PNG" class="align-center" width="331" height="75" loading="lazy" /></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/53" hreflang="es">CALCULATETABLE</a></div> <div class="field__item"><a href="/es/taxonomy/term/49" hreflang="es">NOT</a></div> <div class="field__item"><a href="/es/taxonomy/term/76" hreflang="es">TODAY</a></div> </div> </div> Sat, 13 Apr 2019 09:05:02 +0000 admin 1066 at https://interactivechaos.ovh 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