A veces podemos necesitar realizar una consulta en la cual los resultados se muestren ordenados por la cantidad de ocurrencias de las variables buscadas.

Ejemplo:

Tenemos una tabla de PROVEEDORES que tiene las columnas Código del País, Código del Departamento (Estado o Provincia), Código de la Localidad.

Y lo que deseamos es que en la consulta se muestren en primer lugar los proveedores de la localidad especificada, luego los del departamento especificado y finalmente los del país especificado.

¿Por qué?

Porque debemos hacer un pedido de compras y necesitamos que la mercadería llegue lo más pronto posible, por lo tanto cuanto más cerca de nosotros está el proveedor es más probable que la mercadería llegue más rápido (si está a 2 km se supone que llegará más rápido que si está a 300 km).

Para ello, si una columna cumple con la condición le asignamos un número que es potencia de 2. Y si no la cumple, le asignamos el número 0. A la suma de todos esos valores le llamamos Peso.

Y en la consulta, mostramos primero los los pesos mayores.

SELECT
   (IIF(PRO_PAISXX =  595, 4, 0) +          -- Código del país
    IIF(PRO_CODDEP = '00', 2, 0) +          -- Código del departamento
    IIF(PRO_CODLOC = '01', 1, 0)) AS PESO,  -- Código de la localidad
   PRO_NOMBRE,
   PRO_TELEFO,
   PRO_EMAILX
FROM
   PROVEEDORES
ORDER BY
   1 DESCENDING

Como hay 3 columnas que nos interesan los valores sumados fueron 4, 2, 1. Si hubieran sido 4 columnas entonces usaríamos 8, 4, 2, 1. Con 5 columnas sería 16, 8, 4, 2, 1. Y así sucesivamente.

Como puedes ver, a algunas columnas se les dió más peso que a otras. En este ejemplo la más importante es el País, luego le sigue el Departamento y finalmente la Localidad. En otros casos podría ocurrir que todas las columnas tengan el mismo peso y entonces podrías asignarle un valor de 1 a cada una de ellas.

Por supuesto que esta misma técnica puedes usar con columnas de tipo carácter y las cláusulas LIKE, STARTING WITH, etc.

Artículos relacionados

El índice del blog Firebird21