TOPN https://interactivechaos.ovh/es es Obtención de los datos de ventas relativos a los 10 productos con mayores ventas https://interactivechaos.ovh/es/dax/scenario/obtencion-de-los-datos-de-ventas-relativos-los-10-productos-con-mayores-ventas <span class="field field--name-title field--type-string field--label-hidden">Obtención de los datos de ventas relativos a los 10 productos con mayores ventas</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, 28/07/2019 - 12:17</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 una tabla de ventas ("<em>Sales</em>") y otra con información sobre los productos ("<em>Products</em>"). En la primera tenemos un campo que indica el producto vendido y otro ("<em>Amount</em>") con la cifra de venta. En la tabla de productos tenemos un campo ("<em>Product name</em>") con el nombre del producto. Obviamente, ambas tablas están relacionadas a través de un campo que contiene el identificador de cada producto.</p> <p>El objetivo es la creación de una tabla que contenga toda la información de ventas para los 10 productos con mayores ventas (es decir, queremos un subconjunto de la tabla de ventas <em>Sales</em> que contenga información solo de los 10 productos más vendidos). Este escenario es semejante al de <a href="/dax/scenario/obtencion-de-los-10-clientes-que-mas-compras-acumulan">Obtención de los 10 clientes que más compras acumulan</a>, salvo por el hecho de que, aquí, no queremos un simple listado de productos con sus cifras de ventas, sino toda la información de ventas relativa a dichos productos.</p> <p>El plan es sencillo: Generamos una tabla de ventas totales por cada producto, seleccionamos los 10 con mayores cifras y utilizamos esta información para filtrar la tabla original de ventas de forma que solo incluya datos para dichos productos.</p> <p>Comencemos con la primera de las tablas: la agregación de ventas por producto. Para ello recurrimos a la función <a href="/dax/function/summarize">SUMMARIZE</a>, especificando como campo de agregación <em>Products[Product name]</em> y como columna a crear la resultante de aplicar la función <a href="/dax/function/sum">SUM</a> al campo <em>Sales[Amount]:</em></p> <div class="codigo"> <p>10 productos más vendidos = <br />     VAR<br />         VentasPorProducto =<br />             SUMMARIZE(<br />                 Sales;<br />                 Products[Product name];<br />                 "Sales"; SUM(Sales[Amount])<br />             )<br />     RETURN<br />         VentasPorProducto</p> </div> <img alt="Tabla agregada de total de ventas por producto" data-entity-type="file" data-entity-uuid="380d4e69-2687-4abc-a532-496e93fe4d2c" src="/sites/default/files/inline-images/dax-0002.png" class="align-center" width="402" height="438" loading="lazy" /><p>Como puede verse, se ha llevado la expresión a una variable para poder seguir completando la tabla calculada.</p> <p>Ahora queremos quedarnos solamente con los 10 productos con mayores ventas, para lo que recurrimos a la función <a href="/dax/function/topn">TOPN</a>. Como tabla de partida indicamos la anteriormente obtenida y como expresión, el campo <em>Sales</em> creado:</p> <div class="codigo"> <p>10 productos más vendidos = <br />     VAR<br />         VentasPorProducto =<br />             SUMMARIZE(<br />                 Sales;<br />                 Products[Product name];<br />                 "Sales"; SUM(Sales[Amount])<br />             )<br />     VAR<br />         ProductosMasVendidos =<br />             TOPN(<br />                 10;<br />                 VentasPorProducto;<br />                 [Sales]<br />             )<br />     RETURN<br />         ProductosMasVendidos</p> </div> <img alt="Tabla de los 10 productos más vendidos" data-entity-type="file" data-entity-uuid="03d644f3-2f19-4daa-b993-832d31ba74bf" src="/sites/default/files/inline-images/dax-0003.png" class="align-center" width="407" height="558" loading="lazy" /><p>Por último queremos utilizar esta tabla para filtrar la tabla de ventas, <em>Sales</em>. Para ello vamos a utilizar la función <a href="/dax/function/naturalinnerjoin">NATURALINNERJOIN</a> para crear una combinación natural entre la tabla de ventas y la tabla generada con los productos más vendidos. Al tratarse de una combinación natural interna, solo se mantendrán los registros que compartan los mismos valores en el campo o campos comunes. El campo común es <em>Product Name</em> (en el caso de la tabla <em>Sales</em>, el campo viene dado por su relación con la tabla <em>Products</em>). El código es el siguiente:</p> <div class="codigo"> <p>10 productos más vendidos = <br />     VAR<br />         VentasPorProducto =<br />             SUMMARIZE(<br />                 Sales;<br />                 Products[Product name];<br />                 "Sales"; SUM(Sales[Amount])<br />             )<br />     VAR<br />         ProductosMasVendidos =<br />             TOPN(<br />                 10;<br />                 VentasPorProducto;<br />                 [Sales]<br />             )<br />     RETURN<br />         NATURALINNERJOIN(<br />             Sales;<br />             ProductosMasVendidos<br />         )</p> </div> <p>...y el resultado es el que podemos ver en la siguiente imagen:</p> <img alt="Tabla resultante de la combinación natural interna" data-entity-type="file" data-entity-uuid="548c9793-7802-4047-a9bc-34fdf7c4bf6d" src="/sites/default/files/inline-images/dax-0004.png" class="align-center" width="708" height="555" loading="lazy" /><p>Vemos que se incluyen los campos de ambas tablas. Podríamos seleccionar solo los campos de interés con <a href="/dax/function/selectcolumns">SELECTCOLUMNS</a>, por ejemplo.</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/68" hreflang="es">VAR</a></div> <div class="field__item"><a href="/es/taxonomy/term/51" hreflang="es">SUMMARIZE</a></div> <div class="field__item"><a href="/es/taxonomy/term/28" hreflang="es">SUM</a></div> <div class="field__item"><a href="/es/taxonomy/term/55" hreflang="es">TOPN</a></div> <div class="field__item"><a href="/es/taxonomy/term/98" hreflang="es">NATURALINNERJOIN</a></div> </div> </div> Sun, 28 Jul 2019 10:17:30 +0000 admin 1202 at https://interactivechaos.ovh Obtención de los 10 clientes que más compras acumulan https://interactivechaos.ovh/es/dax/scenario/obtencion-de-los-10-clientes-que-mas-compras-acumulan <span class="field field--name-title field--type-string field--label-hidden">Obtención de los 10 clientes que más compras acumulan</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">Vie, 04/01/2019 - 10:39</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 una tabla de ventas (<em>Sales</em>) que contiene, entre otros campos, la clave que identifica cada cliente (<em>CustomerKey</em>) y el monto involucrado en cada compra (<em>SalesAmount</em>). El objetivo es generar una tabla (que puede ser añadida al modelo de datos o tratada como argumento en otras funciones) que incluya los 10 clientes que más compras acumulan. En este ejemplo concreto se creará una tabla calculada con esta información.</p> <p>El proceso a seguir es:</p> <ol><li>Obtención de una tabla que resuma las compras por cliente</li> <li>Ordenación y filtrado de dicha tabla para extraer apenas los 10 mayores</li> </ol><p>Para la obtención de la tabla recurrimos a la función <a href="/dax/function/summarize">SUMMARIZE</a>:</p> <div class="codigo"> <p>VAR SalesByCustomer =</p> <p>    SUMMARIZE(</p> <p>        Sales;</p> <p>        Sales[CustomerKey];</p> <p>        "Total spent"; SUM(Sales[SalesAmount])</p> <p>    )</p> </div> <p>Estamos resumiendo la tabla <em>Sales</em>, agrupándola por el campo <em>CustomerKey</em> y totalizando, para cada <em>CustomerKey</em>, la suma de las ventas.</p> <p>A continuación no queda más que extraer los 10 valores de CustomerKey que más ventas acumulan, para lo que recurrimos a la función <a href="/dax/function/topn">TOPN</a>:</p> <div class="codigo"> <p>VAR SummaryTableFiltered =</p> <p>    TOPN(</p> <p>        10;</p> <p>        SalesByCustomer;</p> <p>        [Total spent]</p> <p>    )</p> </div> <p>Extraemos 10 registros de la tabla creada en el paso anterior, <em>SalesByCustomer</em>, tomando como criterio el campo <em>Total spent</em>. Obsérvese que éste campo ha sido también creado en el paso anterior.</p> <p>Por último, no queda más que dar un nombre a la tabla que estamos creando (<em>Top 10 customers</em>) y devolver el resultado. El código final es el siguiente:</p> <div class="codigo"> <p>Top 10 customers =</p> <p>    VAR SalesByCustomer =</p> <p>        SUMMARIZE(</p> <p>            Sales;</p> <p>            Sales[CustomerKey];</p> <p>            "Total spent"; SUM(Sales[SalesAmount])</p> <p>        )</p> <p>    VAR SummaryTableFiltered =</p> <p>        TOPN(</p> <p>            10;</p> <p>            SalesByCustomer;</p> <p>            [Total spent]</p> <p>        )</p> <p>    RETURN SummaryTableFiltered</p> </div> <img alt="Obtención de los 10 clientes que más compras acumulan" data-entity-type="file" data-entity-uuid="cdc763c3-0537-490d-9ad5-71546c8b3837" src="/sites/default/files/inline-images/dax_scenario_top_10_customers_01.jpg" class="align-center" width="450" height="502" 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/51" hreflang="es">SUMMARIZE</a></div> <div class="field__item"><a href="/es/taxonomy/term/28" hreflang="es">SUM</a></div> <div class="field__item"><a href="/es/taxonomy/term/55" hreflang="es">TOPN</a></div> <div class="field__item"><a href="/es/taxonomy/term/68" hreflang="es">VAR</a></div> </div> </div> Fri, 04 Jan 2019 09:39:44 +0000 admin 339 at https://interactivechaos.ovh