Usar la correspondencia como alternativa a la unión
El prefijo Join de QlikView constituye un potente método para combinar varias tablas de datos en el modelo de datos. Una desventaja es que las tablas combinadas pueden llegar a ser grandes y crear problemas de rendimiento. Una alternativa a Join en situaciones en las que tenga que buscar un único valor de otra tabla es utilizar la correspondencia en su lugar De este modo se puede evitar la carga de datos innecesarios que ralentizan los cálculos y que puede crear errores de cálculo, ya que las uniones pueden cambiar el número de registros en las tablas.
Una tabla de correspondencia consta de dos columnas: un campo de comparación (entrada) y un campo de valor de correspondencia (salida).
En este ejemplo tenemos una tabla de pedidos (Orders) y necesitamos saber el país del cliente, que se almacena en la tabla de clientes (Customers).
OrderID | OrderDate | ShipperID | Freight | CustomerID |
---|---|---|---|---|
12987 | 2007-12-01 | 1 | 27 | 3 |
12988 | 2007-12-01 | 1 | 65 | 4 |
12989 | 2007-12-02 | 2 | 32 | 2 |
12990 | 2007-12-03 | 1 | 76 | 3 |
CustomerID | Name | Country | ... |
---|---|---|---|
1 | DataSales | Spain | ... |
2 | BusinessCorp | Italy | ... |
3 | TechCo | Germany | ... |
4 | Mobecho | France | ... |
Para buscar el país (Country) de un cliente, se necesita una tabla de correspondencia con este aspecto:
CustomerID | Country |
---|---|
1 | Spain |
2 | Italy |
3 | Germany |
4 | France |
La tabla de correspondencia, a la que llamamos MapCustomerIDtoCountry, se define en el script de la siguiente forma:
El siguiente paso consiste en aplicar la correspondencia, mediante la ApplyMap función, al cargar la tabla de pedidos:
El tercer parámetro de la función ApplyMap se utiliza para definir qué se debe devolver cuando el valor no se encuentra en la tabla de correspondencia, en este caso Null().
La tabla resultante tendrá el siguiente aspecto:
OrderID | OrderDate | ShipperID | Freight | CustomerID | Country |
---|---|---|---|---|---|
12987 | 2007-12-01 | 1 | 27 | 3 | Germany |
12988 | 2007-12-01 | 1 | 65 | 4 | France |
12989 | 2007-12-02 | 2 | 32 | 2 | Italy |
12990 | 2007-12-03 | 1 | 76 | 3 | Germany |