RELATEDTABLE https://interactivechaos.ovh/es es Cálculo de la frecuencia de compra de los clientes https://interactivechaos.ovh/es/dax/scenario/calculo-de-la-frecuencia-de-compra-de-los-clientes <span class="field field--name-title field--type-string field--label-hidden">Cálculo de la frecuencia de compra de los clientes</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, 14/10/2019 - 12:50</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 un listado de clientes:</p> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-10/dax-0024.jpg"><img alt="Tabla de clientes" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-350e337f-140f-4fa2-bda4-0f03477cb3c2" data-insert-attach="{&quot;id&quot;: &quot;350e337f-140f-4fa2-bda4-0f03477cb3c2&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2019-10/dax-0024.jpg" /></a> <p>...y de una tabla de compras de cada uno de ellos:</p> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-10/dax-0025.jpg"><img alt="Tabla de ventas" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-03329b88-76e4-4c9b-8765-af78475b80e1" data-insert-attach="{&quot;id&quot;: &quot;03329b88-76e4-4c9b-8765-af78475b80e1&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2019-10/dax-0025.jpg" /></a> <p>El objetivo es obtener un listado de clientes en el que se muestre el número de días (por ejemplo, podría ser otro período) entre compras. Para hacer el escenario sencillo los clientes reciben como nombre "Cliente x", siendo x el número de compras realizadas (de esta forma, el <em>Cliente 0</em> no ha realizado ninguna, el <em>Cliente 1</em> ha realizado una, etc.), y la frecuencia de compra en días para cada cliente coincide también con x. Así, el cliente 2 realizó una primera compra el 3 de enero, y una segunda dos días más tarde, el 5 de enero.</p> <p>Una vez hemos asegurado que el modelo de datos incluye las relaciones adecuadas (incluyendo una relación entre la tabla de ventas y el necesario calendario), podemos crear una tabla calculada que, usando la función <a href="/dax/function/selectcolumns">SELECTCOLUMNS</a>, extraiga el listado de clientes y agregue la información necesaria. Partimos, por lo tanto, de la siguiente expresión DAX que define esta primera versión de nuestra tabla de resultados:</p> <div class="codigo"> <p>Frecuencia de compra = <br />     SELECTCOLUMNS(<br />         Clientes;<br />         "Nombre"; Clientes[Nombre]<br />     )</p> </div> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-10/dax-0026.jpg"><img alt="Listado de clientes" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-e53eaa7f-c9ca-4db7-8f55-7fbf3b792f47" data-insert-attach="{&quot;id&quot;: &quot;e53eaa7f-c9ca-4db7-8f55-7fbf3b792f47&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2019-10/dax-0026.jpg" /></a> <p>Aunque podríamos calcular directamente la frecuencia de compra para cada uno de ellos, hagámoslo paso por paso, incluyendo una columna adicional para cada uno de los datos que necesitamos.</p> <p>Si entendemos por frecuencia de compra el número de días transcurridos entre la primera compra y la última dividido entre el número de compras realizadas, en primer lugar sería preciso calcular las fechas de primera y de última compra por cliente, para lo que vamos a recurrir a las funciones <a href="/dax/function/firstdate">FIRSTDATE</a> y <a href="/dax/function/lastdate">LASTDATE</a>:</p> <div class="codigo"> <p>Frecuencia de compra = <br />     SELECTCOLUMNS(<br />         Clientes;<br />         "Nombre"; Clientes[Nombre];<br />         "Primera compra"; FIRSTDATE(Calendario[Fecha]);<br />         "Última compra"; LASTDATE(Calendario[Fecha])<br />     )</p> </div> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-10/dax-0027.jpg"><img alt="Listado de clientes con primera y última fecha de compra" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-5c3969df-7095-40d4-b46e-af97df4d2797" data-insert-attach="{&quot;id&quot;: &quot;5c3969df-7095-40d4-b46e-af97df4d2797&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2019-10/dax-0027.jpg" /></a> <p>El cálculo del rango de días entre ambas fechas se reduce a una sencilla resta, que realizaremos usando la función <a href="/dax/function/datediff">DATEDIFF</a>, función que nos permite especificar el período a considerar -días, en nuestro ejemplo-:</p> <div class="codigo"> <p>Frecuencia de compra = <br />     SELECTCOLUMNS(<br />         Clientes;<br />         "Nombre"; Clientes[Nombre];<br />         "Primera compra"; FIRSTDATE(Calendario[Fecha]);<br />         "Última compra"; LASTDATE(Calendario[Fecha]);<br />         "Rango"; DATEDIFF(FIRSTDATE(Calendario[Fecha]); LASTDATE(Calendario[Fecha]); DAY)<br />     )</p> </div> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-10/dax-0028.jpg"><img alt="Listado de clientes con el rango de días de compras" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-0c5b04ec-58bd-46b2-a673-efde628eabbb" data-insert-attach="{&quot;id&quot;: &quot;0c5b04ec-58bd-46b2-a673-efde628eabbb&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2019-10/dax-0028.jpg" /></a> <p>Debemos entender que estamos realizando un enfoque un tanto ingenuo del problema al presuponer que el cliente existe como tal desde su primera compra y solo hasta la última. Más realista sería considerar como comienzo del período el día en el que el cliente "se dio de alta como tal", hubiese realizado o no una compra, y/o considerar como fin del período el día actual, por ejemplo.</p> <p>Considérese también que, al crearse la tabla calculada en un entorno de contexto de fila, para cada cliente se extrae la información de la tabla remota relacionada con él. Así, cuando se está calculando la primera fecha de compra para el cliente X, la expresión</p> <div class="codigo"> <p>FIRSTDATE(Calendario[Fecha])</p> </div> <p>...filtra el campo <em>Fecha</em> de la tabla <em>Calendario</em> de forma que solo incluya las fechas para las que existen compras asociadas al cliente que corresponda.</p> <p>El siguiente paso es contar el número de compras por cliente, para lo que podemos extraer la tabla <em>Ventas</em> (una vez filtrada por el contexto, para lo que usaremos la función <a href="/dax/function/relatedtable">RELATEDTABLE</a>) y contar el número de filas que tiene con <a href="/dax/function/countrows">COUNTROWS</a>:</p> <div class="codigo"> <p>Frecuencia de compra = <br />     SELECTCOLUMNS(<br />         Clientes;<br />         "Nombre"; Clientes[Nombre];<br />         "Primera compra"; FIRSTDATE(Calendario[Fecha]);<br />         "Última compra"; LASTDATE(Calendario[Fecha]);<br />         "Rango"; DATEDIFF(FIRSTDATE(Calendario[Fecha]); LASTDATE(Calendario[Fecha]); DAY);<br />         "Nº de compras"; COUNTROWS(RELATEDTABLE(Ventas))<br />     )</p> </div> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-10/dax-0029.jpg"><img alt="Listado de clientes con el rango de compras y número de éstas" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-b68efa25-a5d8-4ce5-8aa3-96568aef9119" data-insert-attach="{&quot;id&quot;: &quot;b68efa25-a5d8-4ce5-8aa3-96568aef9119&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2019-10/dax-0029.jpg" /></a> <p>Por último queda lo más sencillo, que es dividir el rango de fechas entre el número de compras, para lo que recurriremos a la función <a href="/dax/function/divide">DIVIDE</a>:</p> <div class="codigo"> <p>Frecuencia de compra = <br />     SELECTCOLUMNS(<br />         Clientes;<br />         "Nombre"; Clientes[Nombre];<br />         "Primera compra"; FIRSTDATE(Calendario[Fecha]);<br />         "Última compra"; LASTDATE(Calendario[Fecha]);<br />         "Rango"; DATEDIFF(FIRSTDATE(Calendario[Fecha]); LASTDATE(Calendario[Fecha]); DAY);<br />         "Nº de compras"; COUNTROWS(RELATEDTABLE(Ventas));<br />         "Frecuencia de compra"; DIVIDE(<br />             DATEDIFF(FIRSTDATE(Calendario[Fecha]); LASTDATE(Calendario[Fecha]); DAY);<br />             COUNTROWS(RELATEDTABLE(Ventas))<br />         )<br />     )</p> </div> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-10/dax-0030.jpg"><img alt="Listado de clientes con su frecuencia de compras" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-a1dd98da-72fb-45f2-a860-f2a054bc67d1" data-insert-attach="{&quot;id&quot;: &quot;a1dd98da-72fb-45f2-a860-f2a054bc67d1&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2019-10/dax-0030.jpg" /></a> <p>Comprobamos que, en esta primera versión de la expresión, si un cliente no ha realizado ninguna compra se muestra un BLANK, y si ha realizado una única compra de devuelve una frecuencia de 1. Podríamos completar nuestro DIVIDE con alguna función lógica que realizase un cálculo u otro en función del número de compras y, de esta forma, gestionar estas excepciones.</p> <p>Puede descargarse el fichero Excel y el informe Power BI resultante <a href="https://www.interactivechaos.com/sites/default/files/data/calculo_de_la_frecuencia_de_compra_de_los_clientes.zip">aquí</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/69" hreflang="es">SELECTCOLUMNS</a></div> <div class="field__item"><a href="/es/taxonomy/term/36" hreflang="es">FIRSTDATE</a></div> <div class="field__item"><a href="/es/taxonomy/term/35" hreflang="es">LASTDATE</a></div> <div class="field__item"><a href="/es/taxonomy/term/122" hreflang="es">DATEDIFF</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/67" hreflang="es">COUNTROWS</a></div> <div class="field__item"><a href="/es/taxonomy/term/45" hreflang="es">DIVIDE</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> Mon, 14 Oct 2019 10:50:28 +0000 admin 1482 at https://interactivechaos.ovh 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 una tabla con las ventas medias por vendedor https://interactivechaos.ovh/es/dax/scenario/creacion-de-una-tabla-con-las-ventas-medias-por-vendedor <span class="field field--name-title field--type-string field--label-hidden">Creación de una tabla con las ventas medias por vendedor</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/04/2019 - 14:50</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 dos tablas:</p> <ul><li><em>DimEmployee</em>, conteniendo información sobre los empleados. Esta tabla contiene el campo <em>Name</em> con el nombre completo de cada vendedor, y el campo <em>SalesTerritoryKey</em>, con el territorio de ventas asignado a cada empleado. Hay 10 territorios de ventas (de 1 a 10). Los empleados que no trabajan en ventas reciben un <em>SalesTerritoryKey</em> de 11.</li> <li> <p><em>FactResellerSales</em>, conteniendo información sobre las ventas realizadas. Esta tabla contiene el campo <em>SalesAmount</em> con el precio de venta (de cada una de las ventas) y está enlazada con la anterior a través de un campo <em>EmployeeKey</em>.</p> </li> </ul><p>El objetivo es la creación de una tabla calculada en la que se muestren tres campos: el nombre de cada vendedor, su territorio de ventas y la cifra media de ventas de cada uno.</p> <p>Para la creación de la tabla vamos a utilizar la función <a href="/dax/function/selectcolumns">SELECTCOLUMNS</a> a partir de la tabla de empleados, extrayendo el nombre de los empleados que nos interesan, su territorio, y añadiendo su cifra media de ventas. En pseudo-código sería:</p> <div class="respuesta"> <p>Average sales amount per seller = SELECTCOLUMNS(<br />   DimEmployee;<br />   "Name"; &lt;nombre de cada empleado de ventas&gt;;<br />   "Territory"; &lt;territorio de cada empleado&gt;;<br />   "Average sales"; Cálculo-de-ventas-medias<br /> )</p> </div> <p>Como primer intento, vamos a calculas las ventas medias usando la función <a href="/dax/function/average">AVERAGE</a> para calcular el valor medio de la columna <em>SalesAmount</em>. El código sería el siguiente:</p> <div class="codigo"> <p>Average sales amount per seller = <br />     SELECTCOLUMNS(<br />         DimEmployee;<br />         "Name"; DimEmployee[Name];<br />         "Territory"; DimEmployee[SalesTerritoryKey];<br />         "Average sales"; AVERAGE(FactResellerSales[SalesAmount])<br />     )</p> </div> <p>Y el resultado:</p> <img alt="Creación de una tabla con las ventas medias por vendedor" data-entity-type="file" data-entity-uuid="cac39ca2-cd31-4fbc-a121-a05534aee563" src="/sites/default/files/inline-images/escenario-dax-0000.PNG" class="align-center" width="304" height="290" loading="lazy" /><p>Vemos dos errores: se están mostrando empleados que no pertenecen a ventas (cuyo territorio es el 11) y todas las cifras medias de ventas son iguales, señal de que no estamos personalizando el cálculo para cada vendedor. Arreglemos en primer lugar el primer problema: debemos considerar solo los empleados cuyo territorio de ventas no sea 11. En el código usado vemos que estamos partiendo de la tabla <em>DimEmployee</em> para extraer el nombre, etc. Podemos partir, no de esta tabla completa, sino de la tabla filtrada usando la función <a href="/dax/function/filter">FILTER</a>, de forma que solo se incluyan los vendedores:</p> <div class="codigo"> <p>Average sales amount per seller = <br />     SELECTCOLUMNS(<br />         FILTER(<br />             DimEmployee;<br />             DimEmployee[SalesTerritoryKey] &lt;&gt; 11<br />         );<br />         "Name"; DimEmployee[Name];<br />         "Territory"; DimEmployee[SalesTerritoryKey];<br />         "Average sales"; AVERAGE(FactResellerSales[SalesAmount])<br />     )</p> </div> <p>El resultado en este caso es el siguiente:</p> <img alt="Creación de una tabla con las ventas medias por vendedor" data-entity-type="file" data-entity-uuid="18597f8a-968f-484c-9efe-2ad9ebca71b5" src="/sites/default/files/inline-images/escenario-dax-0001.PNG" class="align-center" width="311" height="323" loading="lazy" /><p>...lo que tiene mucho mejor aspecto. Al respecto del segundo problema -que las cifras devueltas por la función AVERAGE sean las mismas, debemos entender que esta función está considerando toda la tabla de ventas para hacer el cálculo. Tenemos que filtrar esta tabla para que solo considere las ventas de cada empleado. Para ello podemos usar la función <a href="/dax/function/relatedtable">RELATEDTABLE</a> que cambia el contexto en el que se va a realizar el cálculo filtrando la tabla de ventas de forma que solo se considere el subconjunto de esta tabla que esté relacionado con la fila (con el vendedor) siendo considerada. Es decir, para el primer vendedor que vemos en la imagen anterior, Michael Blythe, la función RELATEDTABLE filtraría la tabla de ventas extrayendo solo las ventas en las que Michael aparezca como vendedor asociado a la venta. Pero la función AVERAGE no admite una tabla como argumento... Afortunadamente podemos recurrir a la función <a href="/dax/function/averagex">AVERAGEX</a> que acepta una tabla como primer argumento y una expresión como segundo (que puede ser simplemente el campo <em>SalesAmount</em> que nos interesa):</p> <div class="codigo"> <p>Average sales amount per seller = <br />     SELECTCOLUMNS(<br />         FILTER(<br />             DimEmployee;<br />             DimEmployee[SalesTerritoryKey] &lt;&gt; 11<br />         );<br />         "Name"; DimEmployee[Name];<br />         "Territory"; DimEmployee[SalesTerritoryKey];<br />         "Average sales"; AVERAGEX(<br />             RELATEDTABLE(FactResellerSales);<br />             FactResellerSales[SalesAmount])<br />     )</p> </div> <p>Ahora el resultado es el correcto:</p> <img alt="Creación de una tabla con las ventas medias por vendedor" data-entity-type="file" data-entity-uuid="51dc6991-39ca-4703-a758-ab4a7b3641df" src="/sites/default/files/inline-images/escenario-dax-0002.PNG" class="align-center" width="316" height="324" 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/69" hreflang="es">SELECTCOLUMNS</a></div> <div class="field__item"><a href="/es/taxonomy/term/70" hreflang="es">AVERAGEX</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/71" hreflang="es">RELATEDTABLE</a></div> <div class="field__item"><a href="/es/taxonomy/term/72" hreflang="es">AVERAGE</a></div> </div> </div> Sun, 07 Apr 2019 12:50:59 +0000 admin 1040 at https://interactivechaos.ovh