TOTALYTD https://interactivechaos.ovh/es es Emulación de la función TOTALYTD https://interactivechaos.ovh/es/dax/scenario/emulacion-de-la-funcion-totalytd <span class="field field--name-title field--type-string field--label-hidden">Emulación de la función TOTALYTD</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">Vie, 05/07/2019 - 18:42</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La función <a href="/es/dax/function/totalytd">TOTALYTD</a> es fácil de usar y nos permite calcular rápidamente el resultado de una expresión para el período transcurrido entre el 1 de enero y la última fecha del contexto actual, pero en ocasiones nos encontraremos con que necesitamos un mayor control sobre la expresión evaluada. En este escenario vamos a simular la función TOTALYTD utilizando otras funciones que nos permitirían ese control adicional.</p> <p>Partimos de una tabla denominada <span class="code">Movements</span> donde encontramos movimientos financieros asociados a una fecha (supongamos que se trata de ventas):</p> <img alt="Tabla de movimientos" data-entity-type="file" data-entity-uuid="d6d9cff4-3b60-4c41-8756-9296b87fb31e" src="/sites/default/files/inline-images/escenario-dax-0056.png" class="align-center" width="371" height="481" loading="lazy" /><p>Por otro lado, por supuesto, tenemos una tabla conteniendo un calendario (tabla <span class="code">Calendar</span>):</p> <img alt="Calendario" data-entity-type="file" data-entity-uuid="3d5973de-fbb6-46fc-a7b3-2723117843eb" src="/sites/default/files/inline-images/escenario-dax-0057.png" class="align-center" width="255" height="311" loading="lazy" /><p>Ambas tablas están relacionadas por el campo de fecha. Para simular la función TOTALYTD queremos calcular el acumulado del campo <span class="code">Movements[Total]</span><em> </em>desde principio de año (del período involucrado en el contexto actual) hasta la última fecha del "período actual".</p> <p>La expresión base será la suma del campo <span class="code">Movements[Total]</span>, expresión que servirá de primer argumento de la función <a href="/es/dax/function/calculate">CALCULATE</a>, a la que deberemos añadir como segundo argumento la modificación del contexto de filtro a aplicar. En pseudo-código, la medida a crear es la siguiente:</p> <div class="codigo"> <p>Running Total = <br />     CALCULATE(<br />         SUM(Movements[Total]),<br />         Período entre el 1 de enero del año actual hasta el último día del período actual<br />     )</p> </div> <p>Para el cálculo del período en cuestión (entre el 1 de enero del año correspondiente y el último día del contexto actual) podemos recurrir a filtrar la tabla <span class="code">Calendar</span> con la función <a href="/es/dax/function/filter">FILTER</a> de forma que, dado un contexto actual, seleccione aquellos registros del calendario que involucren las fechas de interés. Es decir, nuestro pseudo-código quedaría así:</p> <div class="codigo"> <p>Running Total = <br />     CALCULATE(<br />         SUM(Movements[Total]),<br />         FILTER(<br />             Calendar,<br />             Período entre el 1 de enero del año actual hasta el último día del período actual<br />         )<br />     )</p> </div> <p>Con la función <a href="/es/dax/function/max">MAX</a> aplicada al calendario podemos calcular tanto el último día del contexto actual (aplicando la función al campo <span class="code">Date</span>) como el año siendo considerado (aplicando la función al campo <span class="code">Año</span>), por lo que para extraer el período de interés podríamos imponer dos condiciones:</p> <ol><li>Que la fecha del calendario sea inferior al último día del contexto actual</li> <li>Que el año del calendario sea igual al año del contexto actual</li> </ol><p>Es decir:</p> <div class="codigo"> <p> Running Total = <br />     CALCULATE(<br />         SUM(Movements[Total]),<br />         FILTER(<br />             Calendar,<br />             Fecha del calendario anterior al último día del contexto actual Y<br />             Año del calendario igual al año del contexto actual<br />         )<br />     )</p> </div> <p>Llevando los campos y funciones reales al pseudo-código anterior tenemos:</p> <div class="codigo"> <p>Running Total = <br />     CALCULATE(<br />         SUM(Movements[Total]),<br />         FILTER(<br />             ALL('Calendar'),<br />             'Calendar'[Date] &lt;= MAX('Calendar'[Date]) &amp;&amp;<br />             'Calendar'[Año] = MAX('Calendar'[Año]<br />             )<br />         )<br />     )</p> </div> <img alt="Código final" data-entity-type="file" data-entity-uuid="643bf1fb-f9bd-43ed-b301-af93081e9895" src="/sites/default/files/inline-images/escenario-dax-0058.png" class="align-center" width="459" height="812" loading="lazy" /><p>Debemos asegurarnos de que la tabla <span class="code">Calendar</span> no está siendo filtrada, por lo que se aplica la función <a href="/es/dax/function/all">ALL</a> (de otro modo se contextualizaría y no nos permitiría siempre extraer el período transcurrido desde principio de año).</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/87" hreflang="es">TOTALYTD</a></div> <div class="field__item"><a href="/es/taxonomy/term/33" hreflang="es">CALCULATE</a></div> <div class="field__item"><a href="/es/taxonomy/term/28" hreflang="es">SUM</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/59" hreflang="es">MAX</a></div> <div class="field__item"><a href="/es/taxonomy/term/37" hreflang="es">ALL</a></div> </div> </div> <div class="field field--name-field-dax-esc-dificultad field--type-list-string field--label-above"> <div class="field__label">Dificultad</div> <div class="field__item">Intermedia</div> </div> Fri, 05 Jul 2019 16:42:41 +0000 admin 1150 at https://interactivechaos.ovh