RELATED https://interactivechaos.ovh/es es Ordenación de una columna https://interactivechaos.ovh/es/dax/scenario/ordenacion-de-una-columna <span class="field field--name-title field--type-string field--label-hidden">Ordenación de una columna</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, 25/06/2019 - 19:11</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La ordenación de la columna de "<em>Nombre del mes</em>" de nuestro calendario es muy sencilla, pues solemos tener otra columna en la misma tabla con el número de mes ("<em>Mes</em>", por ejemplo). En un caso como éste, basta seleccionar el campo "<em>Nombre del mes</em>" en el área de campos y utilizar la herramienta "<em>Modelado &gt; Ordenar por columna</em>" para especificar que el criterio de ordenación viene definido por la columna "<em>Mes</em>".</p> <p>Pero ¿y si no tenemos una columna numérica que nos permita definir ese orden? Pues habría que crearla. Supongamos que tenemos una tabla de nombre "<em>Analitica</em>" en la que se incluyen registros contables (uno por fila), cada registro incluyendo en el campo "<em>Account type</em>" el tipo de cuenta del que se trata en un plan general contable. Si llevamos este campo a nuestro lienzo en una visualización tipo tabla, obtendríamos lo siguiente:</p> <img alt="Columna a ordenar" data-entity-type="file" data-entity-uuid="dbb2d0f4-36d1-4148-b470-12bd5288ab4f" src="/sites/default/files/inline-images/escenario-dax-0019.PNG" class="align-center" width="195" height="191" loading="lazy" /><p>Supongamos, por otro lado, que el orden que queremos aplicar es el siguiente:</p> <img alt="Orden deseado" data-entity-type="file" data-entity-uuid="24640705-3b20-4b56-bf8a-144cc8815c34" src="/sites/default/files/inline-images/escenario-dax-0020.PNG" class="align-center" width="238" height="173" loading="lazy" /><p>...criterio de ordenación que tenemos almacenado en un fichero Excel, tal y como puede verse.</p> <p>Lo primero que habría que hacer sería cargar en Power BI esta tabla, supongamos que con el nombre "<em>Account Type Order</em>":</p> <img alt="Tabla con el criterio de ordenación importada" data-entity-type="file" data-entity-uuid="576822c8-7fe3-4707-b307-9817fded3f14" src="/sites/default/files/inline-images/escenario-dax-0021.PNG" class="align-center" width="271" height="198" loading="lazy" /><p>Vemos que el nombre "<em>Account Type</em>" es el mismo que tiene el campo con el tipo de cuenta original (esto no es relevante) y el campo "<em>Order</em>" contiene el orden deseado. A continuación deberemos crear una relación entre la tabla "<em>Analítica</em>" y la tabla "<em>Account Type Order</em>", usando como campos clave "<em>Account Type</em>" (o los nombres de los campos que contuviesen los nombres de los tipos de cuentas):</p> <img alt="Relación creada entre las tablas" data-entity-type="file" data-entity-uuid="5b973914-45dc-4a50-a977-66e68e64a4f2" src="/sites/default/files/inline-images/escenario-dax-0022.PNG" class="align-center" width="441" height="360" loading="lazy" /><p>Ahora, tenemos dos opciones: ordenar el campo "<em>Account Type</em>" de la tabla "<em>Account Type Order</em>" según el campo "<em>Order</em>" de la misma tabla y usar este campo "<em>Account Type</em>" en nuestras visualizaciones (en lugar del campo "<em>Account Type</em>" de la tabla "<em>Mapping</em>"), o "importar" el campo "<em>Order</em>" a nuestra tabla "<em>Mapping</em>" y ordenar el campo "<em>Account Type</em>" de esta tabla "<em>Mapping</em>" según el campo importado.</p> <p>Si optamos por esta segunda opción, la importación se realizaría añadiendo una columna calculada a "<em>Mapping</em>" con el siguiente código:</p> <div class="codigo">Order = RELATED('Account Type Order'[Order])</div> <p>De esta forma estamos asociando a cada registro de nuestra tabla "<em>Mapping</em>" un número que indica el orden en el que el tipo de cuenta del registro debería mostrarse. Podemos, por tanto, seleccionar el campo "<em>Account Type</em>" de "<em>Mapping</em>" y ordenarlo según el campo "<em>Order</em>" de esta misma tabla. Ahora, la visualización que habíamos creado inicialmente se mostrará de la siguiente forma, tal y como queríamos:</p> <img alt="Campo ordenado" data-entity-type="file" data-entity-uuid="fcd5eac0-02b5-4c43-9b22-e7149848f212" src="/sites/default/files/inline-images/escenario-dax-0023.PNG" class="align-center" width="202" height="213" 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/57" hreflang="es">RELATED</a></div> </div> </div> Tue, 25 Jun 2019 17:11:10 +0000 admin 1135 at https://interactivechaos.ovh Recuento del número de valores distintos de una columna https://interactivechaos.ovh/es/dax/scenario/recuento-del-numero-de-valores-distintos-de-una-columna <span class="field field--name-title field--type-string field--label-hidden">Recuento del número de valores distintos de una columna</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/04/2019 - 11:29</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 dos tablas:</p> <ul><li><strong>Productos</strong>. Tabla de dimensiones conteniendo dos campos, con un identificador de cada producto y el nombre del producto. Vemos que hay 6 productos cuyos identificadores pertenecen al rango [1, 6]:</li> </ul><img alt="Tabla de productos" data-entity-type="file" data-entity-uuid="8fbe927b-2c77-4084-900c-787a5e576e3f" src="/sites/default/files/inline-images/escenario-dax-0006.PNG" class="align-center" width="239" height="157" loading="lazy" /><ul><li><strong>Ventas</strong>: Tabla de hechos con una única columna conteniendo los identificadores de los productos vendidos. Podemos apreciar la existencia de una fila con el identificador 7 que no existe en la tabla de dimensiones anterior, lo que provoca una violación de integridad referencial:</li> </ul><img alt="Tabla de ventas" data-entity-type="file" data-entity-uuid="c6ceeaa5-58a5-4c5a-82d1-e309c90894e3" src="/sites/default/files/inline-images/escenario-dax-0007.PNG" class="align-center" width="99" height="157" loading="lazy" /><p>Si creamos una tabla calculada con los identificadores de los productos vendidos y su nombre (extraído de la tabla producto), el resultado es el siguiente:</p> <div class="codigo"> <p>Productos vendidos = SELECTCOLUMNS(<br />     Ventas;<br />     "Id. Producto"; Ventas[Id Producto];<br />     "Nombre"; RELATED(Productos[Nombre de producto])<br /> )</p> </div> <img alt="Tabla de productos vendidos" data-entity-type="file" data-entity-uuid="41d6673d-adbb-4c58-a3d4-ea90b772e56a" src="/sites/default/files/inline-images/escenario-dax-0008.PNG" class="align-center" width="199" height="135" loading="lazy" /><p>Para acceder a la columna "<em>Nombre de producto</em>" de la tabla "<em>Productos</em>" utilizamos la función <a href="/dax/function/related">RELATED</a> que nos da acceso a una columna remota.</p> <p>Vemos que el producto con identificador 7 no tiene un nombre asociado. Si quisiéramos contar el número de productos vendidos distintos y para ello utilizásemos la segunda columna de la tabla anterior (la que ha recibido el nombre de "Nombre"), podríamos hacerlo con dos funciones distintas: <a href="/dax/function/distinctcount">DISTINCTCOUNT</a> y <a href="/dax/function/distinctcountnoblank">DISTINCTCOUNTNOBLANK</a>. Si definimos dos medidas con estas funciones, tenemos lo siguiente (damos a las medidas el mismo nombre de la función usada en cada caso):</p> <div class="codigo"> <p>DISTINCTCOUNTNOBLANK = DISTINCTCOUNTNOBLANK('Productos vendidos'[Nombre])</p> <p>DISTINCTCOUNT = DISTINCTCOUNT('Productos vendidos'[Nombre])</p> </div> <p>Si llevamos estas medidas a dos visualizaciones tipo tarjeta, tenemos:</p> <img alt="Medidas con el recuento de los valores distintos" data-entity-type="file" data-entity-uuid="5fe5c846-b47b-4403-bd32-16e027c8b8df" src="/sites/default/files/inline-images/escenario-dax-0009.PNG" class="align-center" width="534" height="123" loading="lazy" /><p>Comprobamos que la función DISTINCTCOUNT cuenta el número de valores distintos considerando los valores vacíos (BLANK) como un valor adicional, mientras que DISTINCTCOUNTNOBLANK excluye estos valores vacíos.</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/69" hreflang="es">SELECTCOLUMNS</a></div> <div class="field__item"><a href="/es/taxonomy/term/57" hreflang="es">RELATED</a></div> <div class="field__item"><a href="/es/taxonomy/term/73" hreflang="es">DISTINCTCOUNT</a></div> <div class="field__item"><a href="/es/taxonomy/term/74" hreflang="es">DISTINCTCOUNTNOBLANK</a></div> </div> </div> Tue, 09 Apr 2019 09:29:53 +0000 admin 1044 at https://interactivechaos.ovh Registros para los que no hay un campo asociado en una tabla remota https://interactivechaos.ovh/es/dax/scenario/registros-para-los-que-no-hay-un-campo-asociado-en-una-tabla-remota <span class="field field--name-title field--type-string field--label-hidden">Registros para los que no hay un campo asociado en una tabla remota</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, 05/01/2019 - 16:51</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Supongamos que tenemos una tabla de ventas, <em>Sales</em>, y una tabla con información sobre los productos a la venta, <em>Product</em>. Cada registro de la tabla de ventas está relacionado con un y solo un producto de la tabla <em>Product</em>, pero no todos los productos tienen toda la información disponible: algunos de ellos carecen -por el motivo que sea- de información sobre su color, peso, dimensiones, etc.</p> <p>En este escenario deseamos averiguar qué ventas involucran productos para los que no se conoce un cierto campo, por ejemplo, el peso, contenido en el campo <em>'Product'[Weight].</em></p> <p>Si quisiéramos crear una tabla calculada con esta información, podríamos usar la función <a href="/dax/function/filter">FILTER</a> para filtrar la tabla. El criterio sería mantener solo los registros de ventas para los que el campo remoto <em>'Product'[Weight]</em> contenga algún dato o, dicho con otras palabras, no tengan un valor vacío.</p> <p>En pseudo-código, la definición de la tabla vendría dado por la expresión:</p> <div class="codigo"> <p>Missing weight = FILTER(</p> <p>    Sales;</p> <p>    Campo 'Product[Weight]' no está vacío</p> <p>)</p> </div> <p>Podemos comprobar si un valor es o no vacío usando la función <a href="/dax/function/isblank">ISBLANK</a>, y para acceder a la tabla remota <em>Product</em> deberemos utilizar la función <a href="/dax/function/related">RELATED</a>. El código final sería el siguiente:</p> <div class="codigo"> <p>Missing weight = FILTER(</p> <p>    Sales;</p> <p>    ISBLANK(</p> <p>        RELATED('Product'[Weight])</p> <p>    )</p> <p>)</p> </div> <p>El resultado sería el mostrado en la siguiente imagen:</p> <img alt="Registros de venta sin campo Weight definido" data-entity-type="file" data-entity-uuid="ef2b8645-4249-4f71-a252-e7d3dc0ce865" src="/sites/default/files/inline-images/dax_scenario_registros_sin_campo_asociado_01.jpg" class="align-center" width="947" height="531" 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/48" hreflang="es">FILTER</a></div> <div class="field__item"><a href="/es/taxonomy/term/56" hreflang="es">ISBLANK</a></div> <div class="field__item"><a href="/es/taxonomy/term/57" hreflang="es">RELATED</a></div> </div> </div> Sat, 05 Jan 2019 15:51:41 +0000 admin 349 at https://interactivechaos.ovh Uso de variables en expresiones DAX https://interactivechaos.ovh/es/dax/scenario/uso-de-variables-en-expresiones-dax <span class="field field--name-title field--type-string field--label-hidden">Uso de variables en expresiones DAX</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">Jue, 03/01/2019 - 17:46</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Se describen a continuación varios ejemplos en los que se utilizan variables dentro de expresiones DAX:</p> <h3>Definición de una medida concatenando textos y números</h3> <div class="codigo"> <p>Sales txt = <br />     VAR TotalSales = SUM(Sales[SalesAmount])<br />     VAR Text1 = "Este mes hemos vendido "<br />     VAR Text2 = "Este mes no hemos vendido nada"<br />     RETURN<br />         IF(<br />             TotalSales &gt; 0;                 -- IF<br />             CONCATENATE(Text1; TotalSales); -- THEN<br />             Text2                           -- ELSE<br />         )</p> </div> <p>En este ejemplo se define una primera variable, <em>TotalSales</em>, conteniendo la suma (contextualizada) de la columna <em>SalesAmount</em> de la tabla <em>Sales</em>, columna que contiene los importes de cada venta. A continuación se definen dos variables conteniendo textos que serán usadas en la salida de la medida.</p> <p>El valor devuelto es el resultado de un <a href="/dax/function/if">IF</a>: Si las ventas (recordemos nuevamente, contextualizadas) son mayores que cero, se devuelve un mensaje indicando las ventas: "<em>Este mes hemos vendido XXXX</em>". En caso contrario, se devuelve directamente la cadena de texto <em>Text2</em>: "<em>Este mes no hemos vendido nada</em>". A pesar de los textos usados, la medida así definida no es capaz de distinguir si el contexto ha reducido las fechas a un mes o no.</p> <p>Para la concatenación de los textos se ha usado la función <a href="/dax/function/concatenate">CONCATENATE</a>.</p> <h3>Medida con SWITCH</h3> <div class="codigo"> <p>Greetings = <br />     VAR CurrentTime = HOUR(NOW())<br />     VAR Period =<br />         SWITCH(<br />             TRUE();<br />             CurrentTime &lt; 12; "morning";<br />             CurrentTime &lt; 17; "afternoon";<br />             "evening"<br />         )<br />     RETURN "Good" &amp; " " &amp; Period</p> </div> <p>Se desea devolver en esta medida un mensaje de buenos días, tardes o noches en función de la hora de que se trate. Para ello extraemos hora con la función <a href="/dax/function/hour">HOUR </a>a partir de la fecha y hora actual que devuelve la función <a href="/dax/function/now">NOW</a>.</p> <p>A continuación, asignamos a la variable <em>Period</em> una cadena de texto en función de la hora calculada: Si la hora es anterior a las 12 del mediodía le asignamos el texto "<em>morning</em>", si es anterior a las 5 de la tarde le asignamos el texto "<em>afternoon</em>" y, si no se cumple ninguna de estas dos condiciones, le asignamos el texto por defecto "<em>evening</em>".</p> <p>Por último, devolvemos la concatenación de la palabra "<em>Good</em>" y el contenido de la variable <em>Period</em>, resultando "<em>Good morning</em>", "<em>Good afternoon</em>" o "<em>Good evening</em>".</p> <h3>Creación de una columna calculada</h3> <div class="codigo"> <p>State &amp; Country =</p> <p>    VAR State = Geography[StateProvinceName]</p> <p>    VAR Country = Geography[Country]</p> <p>    RETURN State &amp; ", " &amp; Country</p> </div> <p>En este ejemplo estamos añadiendo a la tabla <em>Geography </em>un campo al que denominamos <em>State &amp; Country</em> conteniendo la concatenación del estado y del país. Para ello extraemos ambos campos y los almacenamos en sendas variables, y devolvemos la concatenación:</p> <img alt="Creación de una columna calculada con variables" data-entity-type="file" data-entity-uuid="5b4c599e-a800-470c-b4d2-aa320f12a350" src="/sites/default/files/inline-images/dax_scenario_variables_01.jpg" class="align-center" width="1011" height="243" loading="lazy" /><h3>Medida que devuelve el número de elementos de una tabla filtrada</h3> <div class="codigo"> <p>Bikes sales =</p> <p>    VAR Bikes = FILTER(Sales; RELATED(Category[Category]) = "Bikes")</p> <p>    RETURN</p> <p>        COUNTROWS(Bikes)</p> </div> <p>En este ejemplo partimos de una tabla de ventas, <em>Sales</em>, y una tabla conteniendo las posibles categorías a las que pertenecen los productos que se venden, <em>Category</em>, y deseamos saber cuántas ventas han sido de productos de la categoría <em>Bikes</em>.</p> <p>Comenzamos extrayendo el subconjunto de la tabla <em>Sales</em> conteniendo las ventas de productos cuya categoría es la buscada, para lo que filtramos la tabla con <a href="/dax/function/filter">FILTER </a>especificando como filtro que la categoría sea <em>Bikes</em>. Al encontrarse esta información (la categoría de cada producto) en una tabla de dimensiones, se necesario usar la función <a href="/dax/function/related">RELATED </a>para acceder a ella.</p> <p>Por último, devolvemos el recuento de las filas de esta tabla usando la función <a href="/dax/function/countrows">COUNTROWS</a>.</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/62" hreflang="es">CONCATENATE</a></div> <div class="field__item"><a href="/es/taxonomy/term/63" hreflang="es">HOUR</a></div> <div class="field__item"><a href="/es/taxonomy/term/64" hreflang="es">NOW</a></div> <div class="field__item"><a href="/es/taxonomy/term/65" hreflang="es">SWITCH</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/48" hreflang="es">FILTER</a></div> <div class="field__item"><a href="/es/taxonomy/term/57" hreflang="es">RELATED</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/68" hreflang="es">VAR</a></div> </div> </div> Thu, 03 Jan 2019 16:46:46 +0000 admin 337 at https://interactivechaos.ovh