MONTH https://interactivechaos.ovh/es es Cálculo del año y mes fiscal correspondientes a cada fecha https://interactivechaos.ovh/es/dax/scenario/calculo-del-ano-y-mes-fiscal-correspondientes-cada-fecha <span class="field field--name-title field--type-string field--label-hidden">Cálculo del año y mes fiscal correspondientes a cada fecha</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">Mar, 09/07/2019 - 13:01</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 calendario en la que se incluyen campos para el año y el número de mes:</p> <img alt="Tabla calendario" data-entity-type="file" data-entity-uuid="b61fe087-d3d8-4380-91bb-c1f556178ac0" src="/sites/default/files/inline-images/escenario-dax-0082.png" class="align-center" width="520" height="400" loading="lazy" /><p>El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.</p> <p>Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:</p> <div class="codigo"> <p>FY = <br />     VAR<br />         UltimoMes = 3<br />     RETURN<br />         'Calendar'[Año] + <br />         IF(<br />             MONTH('Calendar'[Date]) &gt; UltimoMes;<br />             1;<br />             0<br />         )</p> </div> <img alt="Calendario con el campo correspondiente al año fiscal" data-entity-type="file" data-entity-uuid="91048b56-9864-408e-b66b-e30f09799deb" src="/sites/default/files/inline-images/escenario-dax-0083.png" class="align-center" width="433" height="434" loading="lazy" /><p>En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.</p> <p>Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).</p> <p>Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):</p> <div class="codigo"> <p>FM = <br />     VAR<br />         UltimoMes = 3<br />     RETURN<br />         MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1</p> </div> <img alt="Calendario con el campo correspondiente al mes fiscal" data-entity-type="file" data-entity-uuid="a3f6c097-0ac4-40e9-bade-3ad0519a03ea" src="/sites/default/files/inline-images/escenario-dax-0084.png" class="align-center" width="486" height="408" 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/68" hreflang="es">VAR</a></div> <div class="field__item"><a href="/es/taxonomy/term/29" hreflang="es">IF</a></div> <div class="field__item"><a href="/es/taxonomy/term/42" hreflang="es">MONTH</a></div> <div class="field__item"><a href="/es/taxonomy/term/94" hreflang="es">MOD</a></div> </div> </div> Tue, 09 Jul 2019 11:01:19 +0000 admin 1158 at https://interactivechaos.ovh Creación de un calendario https://interactivechaos.ovh/es/dax/scenario/creacion-de-un-calendario <span class="field field--name-title field--type-string field--label-hidden">Creación de un calendario</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, 07/07/2019 - 18:20</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Una de las preguntas más frecuentes relativas al calendario necesario para utilizar funciones de inteligencia de tiempo es ¿Es mejor crearlo externamente a Power BI? ¿O en el editor de consultas? ¿O tal vez con DAX?</p> <p>En este escenario vamos a crear un calendario completo en DAX, incluyendo el número y nombre del mes, trimestre, día de la semana, etc.</p> <p>Para comenzar, creamos la tabla con el calendario básico usando la función <a href="/es/dax/function/calendarauto">CALENDARAUTO</a>. Esta función crea una tabla con una única columna con una secuencia de fechas cubriendo todas las fechas que aparezcan en nuestro conjunto de datos, por defecto desde el 1 de enero del primer año hasta el 31 de diciembre del último año:</p> <div class="codigo"> <p>Calendar = CALENDARAUTO()</p> </div> <img alt="Calendario creado con CALENDARAUTO" data-entity-type="file" data-entity-uuid="41837857-0178-4e3c-acd4-d56266d5d974" src="/sites/default/files/inline-images/escenario-dax-0075.png" class="align-center" width="284" height="324" loading="lazy" /><p>Sin embargo, queremos añadir a esta tabla básica otros campos, para lo que vamos a usar las siguientes funciones DAX (obsérvese en la imagen anterior que el campo creado recibe el nombre de "<em>Date</em>"):</p> <ul><li>Para crear el año: <a href="/es/dax/function/year">YEAR</a></li> <li>Para crear el número de mes: <a href="/es/dax/function/month">MONTH</a></li> <li>Para crear el número de día: <a href="/es/dax/function/day">DAY</a></li> </ul><p>Estos nuevos campos los vamos a añadir a la tabla básica usando la función <a href="/es/dax/function/addcolumns">ADDCOLUMNS</a>:</p> <div class="codigo"> <p>Calendar = <br />     ADDCOLUMNS(<br />         CALENDARAUTO();<br />         "Year"; YEAR([Date]);<br />         "Month"; MONTH([Date]);<br />         "Day"; DAY([Date])<br />     )</p> </div> <img alt="Campos para el año, número de mes y día del mes" data-entity-type="file" data-entity-uuid="bf2996fb-ebfe-4052-b2eb-fef704e53234" src="/sites/default/files/inline-images/escenario-dax-0076.png" class="align-center" width="407" height="387" loading="lazy" /><p>Los nombres para el mes y el día de la semana podemos crearlos con la función <a href="/es/dax/function/format">FORMAT</a>, y el número de la semana y el número de día de la semana con las funciones <a href="/es/dax/function/weeknum">WEEKNUM</a> y <a href="/es/dax/function/weekday">WEEKDAY</a>, respectivamente:</p> <div class="codigo"> <p>Calendar = <br />     ADDCOLUMNS(<br />         CALENDARAUTO();<br />         "Year"; YEAR([Date]);<br />         "Month"; MONTH([Date]);<br />         "Month Name"; FORMAT([Date]; "MMMM");<br />         "Week #"; WEEKNUM([Date]);<br />         "Day"; DAY([Date]);<br />         "Week Day"; WEEKDAY([Date]);<br />         "Day Name"; FORMAT([Date]; "DDDD")<br />     )</p> </div> <img alt="Campos para el nombre del mes y del día, el número de la semana y el número del día de la semana" data-entity-type="file" data-entity-uuid="4b970cc7-125a-477c-bdb7-83ac11805295" src="/sites/default/files/inline-images/escenario-dax-0077.png" class="align-center" width="696" height="501" loading="lazy" /><p>Por último, para obtener el número de trimestre podemos recurrir a la fórmula:</p> <div class="codigo"> <p>CEILING(MONTH([Date])/3;1)</p> </div> <p>...que calcula el entero más próximo igual o superior al mes dividido entre 3 (con la función <a href="/es/dax/function/ceiling">CEILING</a>) .</p> <p>Si quisiéramos también tener el equivalente precedido por una "Q", podemos volver a recurrir a la función FORMAT y al operador &amp; que nos permite concatenar cadenas de texto:</p> <div class="codigo"> <p>Calendar = <br />     ADDCOLUMNS(<br />         CALENDARAUTO();<br />         "Year"; YEAR([Date]);<br />         "Quarter #"; CEILING(MONTH([Date])/3;1);<br />         "Quarter"; "Q" &amp; FORMAT(CEILING(MONTH([Date])/3;1); "#");<br />         "Month"; MONTH([Date]);<br />         "Month Name"; FORMAT([Date]; "MMMM");<br />         "Week #"; WEEKNUM([Date]);<br />         "Day"; DAY([Date]);<br />         "Week Day"; WEEKDAY([Date]);<br />         "Day Name"; FORMAT([Date]; "DDDD")<br />     )</p> </div> <img alt="Campos para el trimestre" data-entity-type="file" data-entity-uuid="1ce90b45-3e40-4719-89cf-33c23cef9583" src="/sites/default/files/inline-images/escenario-dax-0078.png" class="align-center" width="836" height="575" 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/90" hreflang="es">CALENDARAUTO</a></div> <div class="field__item"><a href="/es/taxonomy/term/40" hreflang="es">YEAR</a></div> <div class="field__item"><a href="/es/taxonomy/term/42" hreflang="es">MONTH</a></div> <div class="field__item"><a href="/es/taxonomy/term/43" hreflang="es">DAY</a></div> <div class="field__item"><a href="/es/taxonomy/term/84" hreflang="es">ADDCOLUMNS</a></div> <div class="field__item"><a href="/es/taxonomy/term/44" hreflang="es">FORMAT</a></div> <div class="field__item"><a href="/es/taxonomy/term/91" hreflang="es">WEEKNUM</a></div> <div class="field__item"><a href="/es/taxonomy/term/92" hreflang="es">WEEKDAY</a></div> <div class="field__item"><a href="/es/taxonomy/term/93" hreflang="es">CEILING</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">Baja</div> </div> Sun, 07 Jul 2019 16:20:39 +0000 admin 1156 at https://interactivechaos.ovh Creación de un campo de texto a partir de un campo de fechas https://interactivechaos.ovh/es/dax/scenario/creacion-de-un-campo-de-texto-partir-de-un-campo-de-fechas <span class="field field--name-title field--type-string field--label-hidden">Creación de un campo de texto a partir de un campo de fechas</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">Lun, 07/01/2019 - 21:41</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 vamos a crear un campo con la versión de texto de otro campo de fechas (para convertir, por ejemplo, una fecha del tipo 21 de mayo de 2018 en "20180521", teniendo todos los valores de la nueva columna la misma longitud).</p> <p>Supongamos que nuestro campo de fechas con formato <em>datetime</em> es <em>Sales[Ship Date]:</em></p> <img alt="Campo Sales[Ship Date]" data-entity-type="file" data-entity-uuid="950bc7a2-ef4b-4e2b-be45-fdd867a6eecb" src="/sites/default/files/inline-images/dax_scenario_texto_de_fecha_01.jpg" class="align-center" width="246" height="340" loading="lazy" /><p>Para formar nuestra nueva columna deberemos extraer el año, mes y día (podríamos hacerlo más complejo extrayendo la hora, etc.) con las funciones <a href="/dax/function/year">YEAR</a>, <a href="/dax/function/month">MONTH</a> y <a href="/dax/function/day">DAY</a>. Una primera versión de la expresión para crear la nueva columna podría ser, sencillamente, la concatenación de dichos valores, pero podemos ver que no funcionaría con días o meses menores de 10, pues resultarían cadenas de texto de menos de 8 caracteres (en lugar de usar la función <a href="/dax/function/concatenate">CONCATENATE</a> vamos a usar el operador de concatenación &amp;):</p> <div class="codigo"> <p>ShipDateKey = YEAR(Sales[Ship Date]) &amp; MONTH(Sales[Ship Date]) &amp; DAY(Sales[Ship Date])</p> </div> <img alt="Columna con al versión de texto de la fecha" data-entity-type="file" data-entity-uuid="9e5387c9-aed0-44df-b6a1-4329d1928507" src="/sites/default/files/inline-images/dax_scenario_texto_de_fecha_02.jpg" class="align-center" width="626" height="302" loading="lazy" /><p>Debemos asegurar que tanto el mes como el día tienen ceros a la izquierda en caso de ser necesario para mantener la longitud de 2 caracteres (el año -en nuestros datos- siempre tiene 4 caracteres de longitud). Para esto podemos utilizar la función <a href="/dax/function/format">FORMAT</a> o añadir un cero a la izquierda del mes y del día (tanto si se necesita como si no) y extraer los dos caracteres de la derecha, alternativa que utilizaremos aquí por motivos pedagógicos. Si el cero no hacía falta, los dos caracteres que extraigamos serán los originales. Si, por el contrario, era necesario, estaremos extrayendo el cero y el valor original. Así, por ejemplo, si hemos extraído los meses 11 y 5, esta operación resultaría en las siguientes cadenas de texto:</p> <p>"0" &amp; "11" = "011" » "11"</p> <p>"0" &amp; "5" = "05" » "05"</p> <p>Para extraer los dos caracteres de la derecha utilizaremos la función <a href="/dax/function/right">RIGHT</a>, de forma que la versión final de la expresión sería:</p> <div class="codigo"> <p>ShipDateKey =</p> <p>    YEAR(Sales[Ship Date]) &amp;</p> <p>    RIGHT("0" &amp; MONTH(Sales[Ship Date]); 2) &amp;</p> <p>    RIGHT("0" &amp; DAY(Sales[Ship Date]); 2)</p> </div> <p>El resultado, esta vez correcto, sería el mostrado en la siguiente imagen:</p> <img alt="Columna con la versión de texto correcta del campo de fecha" data-entity-type="file" data-entity-uuid="9316a7e8-57d2-4b0c-81cf-f79b87b0af3c" src="/sites/default/files/inline-images/3dax_scenario_texto_de_fecha_03.jpg" class="align-center" width="637" height="347" loading="lazy" /><p>Si utilizásemos la función FORMAT, el código quedaría de la siguiente forma:</p> <div class="codigo"> <p>ShipDateKey =</p> <p>    YEAR(Sales[Ship Date]) &amp;</p> <p>    FORMAT(MONTH(Sales[Ship Date]); "00") &amp;</p> <p>    FORMAT(DAY(Sales[Ship Date]); "00"</p> <p>)</p> </div> </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/40" hreflang="es">YEAR</a></div> <div class="field__item"><a href="/es/taxonomy/term/41" hreflang="es">RIGHT</a></div> <div class="field__item"><a href="/es/taxonomy/term/42" hreflang="es">MONTH</a></div> <div class="field__item"><a href="/es/taxonomy/term/43" hreflang="es">DAY</a></div> <div class="field__item"><a href="/es/taxonomy/term/44" hreflang="es">FORMAT</a></div> </div> </div> Mon, 07 Jan 2019 20:41:41 +0000 admin 354 at https://interactivechaos.ovh