AVERAGEX https://interactivechaos.ovh/es es 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