WEEKDAY https://interactivechaos.ovh/es es Marcado de días como laborables o no laborables https://interactivechaos.ovh/es/dax/scenario/marcado-de-dias-como-laborables-o-no-laborables <span class="field field--name-title field--type-string field--label-hidden">Marcado de días como laborables o no laborables</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, 14/07/2019 - 09:20</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La adición de esta información a nuestra tabla de calendario -si cada uno de los días es o no laborable- puede resultar de gran utilidad de muchos casos. Planteémonos, en primer lugar, el caso más sencillo: el marcado de cada uno de los días en función del día de la semana de que se trate. Es decir, marquemos como laborables los días entre el lunes y el viernes, ambos incluidos, y como no laborables el sábado y el domingo. Para ello vamos a utilizar la función <a href="/dax/function/weekday">WEEKDAY</a> que acepta como argumento una fecha y devuelve un número identificando el día de la semana correspondiente.</p> <p>Partimos de una tabla "<em>Calendar</em>" que incluye únicamente una columna con las fechas:</p> <img alt="Tabla calendario" data-entity-type="file" data-entity-uuid="287975a2-fe80-44b5-9dcf-c0688d1cb295" src="/sites/default/files/inline-images/escenario-dax-0090.png" class="align-center" width="182" height="270" loading="lazy" /><p>Creamos una nueva columna calculada en la que extraemos el número de día de la semana:</p> <div class="codigo"> <p>Nº de día de la semana =<br />     WEEKDAY('Calendar'[Date];2)</p> </div> <p>En este caso se ha optado por la opción 2 (de las tres que se ofrecen), opción que asigna el valor 1 al lunes y el 7 al domingo:</p> <img alt="Calendario incluyendo el número de día de la semana" data-entity-type="file" data-entity-uuid="35ac43d6-5558-435a-92dd-57d4cdf90d7e" src="/sites/default/files/inline-images/escenario-dax-0091.png" class="align-center" width="327" height="335" loading="lazy" /><p>Podemos comparar los nombres de los días de la semana que se muestran en la función <em>Date</em> con el valor mostrado en la columna recién creada para confirmar que el criterio es el comentado. Así, por ejemplo, la primera fecha mostrada en la del jueves 1 de enero de 2015, día al que se asigna correctamente el valor 4 en la recién creada columna calculada.</p> <p>En realidad no hubiera sido necesario crear esta columna, apenas nos sirve para confirmar los valores que reciben cada uno de los días. Lo que sí es necesario en la creación de una columna -a la que podemos llamar <em>Día laboral</em>- que, por ejemplo, contenga el booleano TRUE cuando el día sea laboral, y el booleano FALSE cuando no lo sea. Y para esta asignación vamos a comparar el valor numérico asignado por la función WEEKDAY a cada uno de los días: cuando tome los valores 1, 2, 3, 4 o 5, se asignará el valor TRUE, y cuando tome los valores 6 o 7, FALSE. Lógicamente estos valores son los correctos solo si estamos usando la función WEEKDAY con la mencionada opción 2. Si escogiésemos otra opción, habría que escoger las cifras adecuadamente:</p> <div class="codigo"> <p>Día laboral = <br />     IF(<br />         WEEKDAY('Calendar'[Date]; 2) &lt; 6;<br />         TRUE();<br />         FALSE()<br />     )</p> </div> <img alt="Calendario con los días marcados como laborables o no laborables" data-entity-type="file" data-entity-uuid="61008365-5edc-4674-815b-f93cad57427c" src="/sites/default/files/inline-images/escenario-dax-0092.png" class="align-center" width="407" height="474" loading="lazy" /><p>En un segundo paso, si quisiéramos añadir como días no laborables otras festividades, podríamos recurrir a mantener otra tabla con este listado. Por ejemplo, supongamos que las fechas no laborables adicionales son las mostradas en la siguiente tabla ("<em>Festivos</em>"):</p> <img alt="Tabla de festivos" data-entity-type="file" data-entity-uuid="0709eb31-d6ce-4f96-928d-b2406e1dd240" src="/sites/default/files/inline-images/escenario-dax-0093.png" class="align-center" width="162" height="73" loading="lazy" /><p>Relacionamos ambas tablas:</p> <img alt="Tablas relacionadas" data-entity-type="file" data-entity-uuid="751866e4-492e-4d27-b171-65584857be69" src="/sites/default/files/inline-images/escenario-dax-0094.png" class="align-center" width="407" height="304" loading="lazy" /><p>Y, a continuación, modificamos el código que hemos creado de forma que asigne el valor TRUE si y solo si el número de día es menor que 6 y no aparece en la tabla de festivos. Esta última condición puede ser escrita de diversas maneras. Por ejemplo, contando el número de filas de la tabla <em>Festivos</em> asociada a cada fecha del calendario: cuando la fecha en cuestión no esté incluida en <em>Festivos</em>, esta tabla no contendrá ningún registro. Y cuando esté, tendrá uno:</p> <div class="codigo"> <p>Día laboral = <br />     IF(<br />         WEEKDAY('Calendar'[Date]; 2) &lt; 6 &amp;&amp; COUNTROWS(RELATEDTABLE(Festivos)) = 0;<br />         TRUE();<br />         FALSE()<br />     )</p> </div> <p>El resultado es el mostrado en la siguiente imagen:</p> <img alt="Calendario considerando los festivos" data-entity-type="file" data-entity-uuid="72e2356c-64a3-4d8e-abdc-b9411aeca29c" src="/sites/default/files/inline-images/escenario-dax-0095.png" class="align-center" width="457" height="510" loading="lazy" /><p>Podemos ver que los días 6 y 13 de enero han sido marcados como "no laborables", tal y como esperábamos.</p> <p>Por supuesto, este escenario podría hacerse más complejo para mostrar diferentes columnas para diferentes localidades o países, etc.</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/29" hreflang="es">IF</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/67" hreflang="es">COUNTROWS</a></div> <div class="field__item"><a href="/es/taxonomy/term/71" hreflang="es">RELATEDTABLE</a></div> <div class="field__item"><a href="/es/taxonomy/term/66" hreflang="es">TRUE</a></div> <div class="field__item"><a href="/es/taxonomy/term/95" hreflang="es">FALSE</a></div> </div> </div> Sun, 14 Jul 2019 07:20:08 +0000 admin 1162 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