YEAR https://interactivechaos.ovh/es es Ordenación inversa de años https://interactivechaos.ovh/es/dax/scenario/ordenacion-inversa-de-anos <span class="field field--name-title field--type-string field--label-hidden">Ordenación inversa de años</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 - 12:22</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La herramienta "<em>Ordenar por columna</em>" que tenemos a nuestra disposición en la barra de tareas de Power BI (<em>Modelado &gt; Ordenar &gt; Ordenar por columna</em>) nos permite establecer el orden por defecto de una columna basándose en otra existente. Esto nos permite, por ejemplo, ordenar los nombres de los meses si tenemos una columna que incluya el número de mes. Pero supongamos que tenemos que ordenar el campo "<em>Año</em>" de nuestra tabla calendario en sentido descendente ¿cómo podríamos hacerlo?</p> <p>Supongamos que partimos de la siguiente tabla calendario, en la que se incluye un campo con la fecha ("<em>Date</em>") y otro con el año ("<em>Año</em>"):</p> <img alt="Tabla calendario" data-entity-type="file" data-entity-uuid="c45c9834-fbf5-4015-b8e5-f4eda74275a1" src="/sites/default/files/inline-images/escenario-dax-0079.png" class="align-center" width="254" height="311" loading="lazy" /><p>Por lo comentado, haría falta una columna de referencia según la cual ordenar el campo <em>Año</em> en cuestión. Podemos añadir esta columna calculada usando la siguiente expresión:</p> <div class="codigo"> <p>Año inverso = 0 - YEAR('Calendar'[Date])</p> </div> <p>Esto crea una versión de la columna Año con su valor negativo:</p> <img alt="Tabla calendario con el campo &quot;Año inverso&quot; creado" data-entity-type="file" data-entity-uuid="0e4b4308-5a58-40a8-a725-d7236a59b913" src="/sites/default/files/inline-images/escenario-dax-0080.png" class="align-center" width="346" height="295" loading="lazy" /><p>...columna que ahora nos sirve para establecer el orden de la columna <em>Año</em> haciendo uso de la herramienta comentada al principio. Si, tras usarla, llevamos el campo <em>Año</em> a una visualización tipo <em>Tabla</em>, el resultado es el siguiente:</p> <img alt="Campo año con la nueva ordenación por defecto" data-entity-type="file" data-entity-uuid="5c13c4ce-0fed-4bb5-9b5c-b4486ec03ee6" src="/sites/default/files/inline-images/escenario-dax-0081.png" class="align-center" width="203" height="223" 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/40" hreflang="es">YEAR</a></div> </div> </div> Tue, 09 Jul 2019 10:22:33 +0000 admin 1157 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