lunes, septiembre 23, 2019

BUSCARV o Combinar consultas del Power Query

Un comentario a mi post Cálculo de comisiones por tramos trajo a mi memoria una charla que mantuve con una persona del departamento contable. Nuestro contador en cuestión estaba interesado en escuchar sobre la "nueva herramienta" (para él), Power Query, y cómo podría ayudarle en sus tareas cotidianas. Mi interlocutor cerró mi breve exposición sobre la utilidad y las capacidades de Power Query con la siguiente sentencia: "muy interesante pero yo no tengo necesidad de esa herramienta".
Como conozco las tareas del contador no me cabe duda de que Power Query es una herramienta indispensable para él, en términos de ahorro de tiempo y errores. Pero si algo he aprendido con los años es no entrar en discusiones estériles.Yendo al grano de la cuestión d este post: si muchas tareas se pueden hacer con BUSCARV, ¿por qué usar Combinar consultas del Power Query en su lugar?
Muchas tareas que realizamos con Power Query pueden hacerse, sin dudas, con Excel Clásico y para quien lleva mucho tiempo trabajando con Excel Clásico la inversión en tiempo y esfuerzo para aprender Power Query puede parecer infundada.
En esta nota voy a intentar exponer los criterios a tomar en cuenta al decidir si haremos una tarea con Excel Clásico o con Power Query.
Empecemos por decir qué es Power Query. Es una herramienta destinada a preparar datos para un posterior análisis. Es una herramienta ETL (Extract - Transform - Load) es decir, que nos permite:
  • extraer datos de una o más fuentes y en este último caso combinarlos;
  • transformarlos, es decir, adaptarlos a nuestros requerimientos;
  • cargarlos (load) al medio donde haremos nuestros análisis (dejándolos como "solo conexión", cargándolos a una hoja de Excel o al modelo de datos).
Si bien podemos crear reportes con Power Query este herramienta no está diseñada para analizar datos. Para esas tareas tenemos a Excel, por lo general usando tablas dinámicas, o PowerPivot.

Por otro lado es posible realizar tareas ETL con Excel por lo que vamos a analizar los pro y contras de cada herramienta en las "zonas superpuestas". Veamos el caso de BUSCARV frente a Combinar consultas.

Una tarea clásica con Excel es combinar datos de dos tablas usando BUSCARV o una combinación de INDICE con COINCIDIR. El uso de estas funciones es relativamente sencillo y su dominio es el certificado de entrada del usuario principiante a usuario medio-avanzado.
Pero BUSCARV tiene varias debilidades y es en estas situaciones que preferiremos usar Combinar consultas del Power Query.

1 - Más de una coincidencia por valor de búsqueda.

Cuando hay más de una coincidencia en la tabla de búsqueda BUSCARV da como resultado la primer coincidencia. Si queremos obtener una en particular, por ejemplo la segunda, deberemos aplicar fórmulas complicadas (y fórmulas complicadas siempre conllevan el riesgo de tener errores difíciles de detectar). La solución con Power Query es más sencilla y fácil de controlar.

2 - Búsqueda con más de un criterio.

Con Excel Clásico podemos hacer búsquedas basadas en más de un criterio usando técnicas como las que muestro en esta nota. Pero, nuevamente, tendremos que aplicar fórmulas complejas o trabajar con tablas dinámicas y segmentación de datos. Por su lado Power Query permite hacer combinación de consultas en base a varios criterios, en forma natural y con facilidad.

3 - Problemas con el tiempo de recálculo de la hoja.

El uso intensivo de fórmulas con BUSCARV tiene un precio elevado en términos de tiempo de recálculo. Eventos como filtrado de la tabla hacen que Excel recalcule todas las fórmulas de la hoja. En el departamento de logística de la empresa donde trabajo usan una hoja para planificar los envíos de cada semana. Una de las columnas de la tabla contenía una fórmula con BUSCARV para poner la categoría de cada producto. La tabla consiste en una 9000 filas en promedio (varía de semana en semana). Una vez actualizadas las categorías el coordinador emplea el filtro de datos a una caegoría específica para ver qué productos hay que enviar. El recálculo de la hoja, cada vez que se aplica un filtro, dura más de cinco minutos (!) y en ciertos casos produce el colapso de Excel.
En el mismo modelo pero usando Combinar consultas el tiempo de recálculo se redujo a menos de dos segundos.

4 - Más de un resultado por valor de búsqueda.

Hay situaciones en las que buscamos todas las coincidencias de un valor en la tabla de búsqueda. Por ejemplo, todos los números orden de un producto.
Supongamos esta lista de órdenes de clientes (la tabla tiene 2155 filas)


y esta lista de 10 productos escogidos. Nuestra tarea es mostrar todas las órdenes de cada producto de esta lista.
BUSCARV puede devolver solamente un resultado así que no nos sirve para esta tarea. Pero con Combinar consultas la hacemos con unos pocos clics.

1 - creamos las consultas a ambas tablas

En nuestro ejemplo las tablas se encuentran en las hojas del cuaderno por lo que creamos las consultas como "sólo conexión".

2 - Creamos una consulta combinando ambas tablas de esta manera



3 - Expandimos la columna [Ordenes] seleccionando sólo la columna [Orden], ordenamos la columna [Producto] alfabéticamente y así obtenemos una tabla con todos los productos elegidos y sus órdenes de compra


Una variante interesante es crear el informe de manera que haya solamente una fila por producto y una columna con todas las órdenes o varias columnas con las órdenes.
Para hacerlo vamos a usar Agrupar por agrupando por [Producto] la consulta de arriba


Ahora vamos a editar el código creado automáticamente abriendo el Editor avanzado (tal como mostré en esta nota). El código en el editor avanzado se ve así


1:  let  
2:    Origen = Table.NestedJoin(Productos, {"Producto"}, Ordenes, {"Producto"}, "Ordenes", JoinKind.LeftOuter),  
3:    #"Se expandió Ordenes" = Table.ExpandTableColumn(Origen, "Ordenes", {"Orden Nro."}, {"Orden Nro."}),  
4:    #"Filas ordenadas" = Table.Sort(#"Se expandió Ordenes",{{"Producto", Order.Ascending}}),  
5:    #"Filas agrupadas" = Table.Group(#"Filas ordenadas", {"Producto"}, {{"Recuento", each Table.RowCount(_), type number}})  
6:  in  
7:    #"Filas agrupadas"  

Vamos a cambiar a fila 5 de esta manera agregando {"Ordenes", each [Orden]}

1:  let  
2:    Origen = Table.NestedJoin(Productos, {"Producto"}, Ordenes, {"Producto"}, "Ordenes", JoinKind.LeftOuter),  
3:    #"Se expandió Ordenes" = Table.ExpandTableColumn(Origen, "Ordenes", {"Orden"}, {"Orden"}),  
4:    #"Filas ordenadas" = Table.Sort(#"Se expandió Ordenes",{{"Producto", Order.Ascending}}),  
5:    #"Filas agrupadas" = Table.Group(#"Filas ordenadas", {"Producto"}, {  
6:      {"Recuento", each Table.RowCount(_), type number},  
7:      {"Ordenes", each [Orden]}  
8:      })  
9:  in  
10:    #"Filas agrupadas"  

En en el editor de Power Query veremos

Hemos agregado la columna [Ordenes] que podemos expandir haciendo un clic sobre la doble flecha que aparece a la derecha del encabezamiento de la columna. Al hacerlo vemos que hay dos posibilidades de expansión


Elegimos Extraer valores eligiendo algún delimitador, en este ejemplo "punto y coma" con este resultado


Podemos decidir dejar o eliminar la columna [Recuento] y cargar la consulta en un hoja de Excel. Tendremos así una fila por cliente con una columna que muestra todas las órdenes del cliente.


Alternativamente podemos dividir la columna [Ordenes] en varias columnas.

2 comentarios:

  1. Hola Jorge
    Muy interesante el analisis... Solo me queda la duda de si mis archivos de bases de datos tienen un máximo de 5000 registros me conviene o no usar power query

    ResponderBorrar
    Respuestas
    1. Para dar una respuesta hay que tomar en cuenta varias consideraciones. Por ejemplo, que otras funciones hay en la hoja. Si todo lo que hay es cinco mil formulas con la función BUSCARV, el tiempo de recalculo puede ser "soportable", dependiendo de los recursos disponibles en tu máquina. Pero si cada tanto hay que hacer operaciones que implican recalcular la hoja, como Autofiltro, el trabajo con la hoja puede ser bastante lento (de hecho fue el caso que me dio la inspiración para el post).
      Si se trata de un modelo donde los datos cambian tanto, sin lugar a dudas Power Query es la herramienta a usar. En particular si la cantidad de registros cambia en cada "set" de datos.

      Borrar

Nota: sólo los miembros de este blog pueden publicar comentarios.