Como hacer consulta Access seleccionando el primer registro de un rango de valores

Tengo una tabla con datos de todos los pueblos de cada provincia y quiero hacer una consulta o informe sacando el primer pueblo de cada provincia que cumpla con los parámetros que yo elija. También me gustaría poder decir que, en vez de ser el primer registro, sea el registro numero 10, o el que sea, de cada provincia. Pero solo uno por provincia.

3 Respuestas

Respuesta
1

Lamentablemente Access no tiene la función de ventana ROW_NUMBER() de SQL SERVER y otros servidores de datos, en mi caso uso PostgreSQL.

Para lograr esto en Access, necesita usar una combinación de consultas, principalmente la función TOP (o SELECT TOP) y posiblemente subconsultas o la función Nz si manejas valores nulos.

Le explico cómo hacerlo paso a paso, abordando las dos partes de su pregunta: sacar el primer pueblo de cada provincia y sacar el registro número N.

Asumamos que tu tabla se llama Pueblos y tiene al menos los siguientes campos:

Provincia (Texto)

Pueblo (Texto)

ID (Numérico, clave primaria o un campo de orden para definir "primer")

Parte 1: Seleccionar el primer registro de un rango de valores (el primer pueblo de cada provincia)

La clave aquí es usar una consulta de agrupación para encontrar el "primer" pueblo de cada provincia, y luego unirla con la tabla original para obtener todos los detalles de ese pueblo.

Paso 1: Definir qué es "primer"

Para Access, "primer" suele significar el valor más bajo en un campo que ordena tus registros. Si quieres el primer pueblo alfabéticamente, usarás el campo Pueblo. Si tiene un campo ID o un autonumérico que le indica el orden de entrada, usará ese campo.

Opción A: Usando el campo ID (o un campo numérico que define el orden)

  1. Cree una consulta que encuentre el ID mínimo (primer registro) para cada provincia:

Ve a Crear > Diseño de consulta.

Agregue su tabla Pueblos.

Arrastre Provincia y ID a la cuadrícula de diseño.

Haga clic en el botón Totales (el que tiene el símbolo sigma Σ).

En la fila Total para ID, cambie Agrupar por a Mín (o Min).

Su consulta se verá algo así en SQL:

SQL

SELECT Provincia, Min(ID) AS PrimerID

FROM Pueblos

GROUP BY Provincia;

Guarde esta consulta como ConsultaPrimerIDPorProvincia.

  1. Cree una segunda consulta que una esta consulta de IDs mínimos con la tabla original:

Crea una nueva consulta en Diseño de consulta.

Agrega la tabla Pueblos y tu consulta ConsultaPrimerIDPorProvincia.

Une Provincia de Pueblos con Provincia de ConsultaPrimerIDPorProvincia.

Une ID de Pueblos con PrimerID de ConsultaPrimerIDPorProvincia.

Arrastre todos los campos que necesites de la tabla Pueblos (Provincia, Pueblo, etc.).

Su consulta SQL será similar a:

SQL

SELECT P.Provincia, P.Pueblo, P.ID

FROM Pueblos AS P INNER JOIN ConsultaPrimerIDPorProvincia AS CPID ON (P.Provincia = CPID.Provincia) AND (P.ID = CPID.PrimerID);

Esta consulta te dará el primer pueblo (basado en el ID más bajo) de cada provincia.

Opción B: Usando el campo Pueblo (primer pueblo alfabéticamente)

Si "primer" significa el primer pueblo alfabéticamente, simplemente reemplace Min(ID) por Min(Pueblo) en el Paso 1 de la Opción A, y luego únelo por Pueblo en el Paso 2.

  1. Crea una consulta que encuentre el nombre de pueblo mínimo (alfabéticamente) para cada provincia:

SQL

SELECT Provincia, Min(Pueblo) AS PrimerPuebloAlfabetico

FROM Pueblos

GROUP BY Provincia;

Guarda esta consulta como ConsultaPrimerPuebloAlfabetico.

  1. Crea una segunda consulta que una esta consulta con la tabla original:

SQL

SELECT P.Provincia, P.Pueblo, P.ID

FROM Pueblos AS P INNER JOIN ConsultaPrimerPuebloAlfabetico AS CPPA ON (P.Provincia = CPPA.Provincia) AND (P.Pueblo = CPPA.PrimerPuebloAlfabetico);

Esto le dará el primer pueblo alfabéticamente de cada provincia.

Parte 2: Seleccionar el registro número N de cada provincia

Esto es un poco más complejo en Access, ya que no hay una función directa como ROW_NUMBER() en otros sistemas de bases de datos. La forma más común es usar una subconsulta correlacionada para contar los registros anteriores.

Consideraciones:

Necesitará un campo que defina el orden dentro de cada provincia (por ejemplo, ID o Pueblo).

Esto puede ser menos eficiente con tablas muy grandes.

Paso 1: Crear la consulta que encuentra el N-ésimo registro

Supongamos que quiere el registro número 3 (es decir, el tercer pueblo en orden de ID o alfabético) de cada provincia.

  1. Define el orden: Asegúresede tener un campo que defina el orden de los pueblos dentro de cada provincia. Usaremos ID como ejemplo, asumiendo que los IDs son secuenciales o al menos definen el orden que deseas.
  2. Crear una consulta en Diseño de consulta (o directamente en vista SQL):

SQL

SELECT P1.Provincia, P1.Pueblo, P1.ID

FROM Pueblos AS P1

WHERE (((SELECT Count(P2.ID)

         FROM Pueblos AS P2

         WHERE P2.Provincia = P1.Provincia AND P2.ID <= P1.ID) = 3));

Explicación de la subconsulta:

P1 es un alias para la tabla Pueblos en la consulta principal.

P2 es un alias para la misma tabla Pueblos en la subconsulta.

P2.Provincia = P1. Provincia: Asegura que contamos registros dentro de la misma provincia.

P2.ID <= P1. ID: Cuenta todos los registros que tienen un ID menor o igual al ID del registro actual (P1).

Count(P2. ID): Nos da la "posición" del registro actual dentro de su provincia, basado en el orden del ID.

= 3: Filtra para seleccionar solo el registro cuya "posición" sea 3.

Para seleccionar el registro número 10, simplemente cambie = 3 a = 10.

Si el orden es alfabético por Pueblo:

Simplemente reemplace P2.ID <= P1.ID por P2.Pueblo <= P1. Pueblo (y asegúrese de que el campo Pueblo no tenga valores repetidos si lo usa para ordenar de esta manera, o añade un campo de desempate).

SQL

SELECT P1.Provincia, P1.Pueblo, P1.ID

FROM Pueblos AS P1

WHERE (((SELECT Count(P2.Pueblo)

         FROM Pueblos AS P2

         WHERE P2.Provincia = P1.Provincia AND P2.Pueblo <= P1.Pueblo) = 3));

Para hacer un informe

Una vez que tengas la consulta que te da los resultados deseados (ya sea el primer registro o el N-ésimo), crear un informe es sencillo:

  1. Ve a Crear > Asistente para informes (o Diseño de informe).
  2. Selecciona la consulta que acabas de crear como origen de datos para tu informe.
  3. Sigue los pasos del asistente para diseñar tu informe, agrupando si es necesario por Provincia si quieres tener una sección para cada una, y mostrando los detalles del pueblo seleccionado.

Consideraciones adicionales y parámetros

Parámetros para elegir los valores: Si quiere que los parámetros (Provincia, Pueblo, etc.) sean elegibles por el usuario, puede agregarlos a la cláusula WHERE de sus consultas y Access te pedirá los valores cuando ejecutes la consulta.

Ejemplo de consulta con un parámetro para filtrar por provincia:

SQL

SELECT P.Provincia, P.Pueblo, P.ID

FROM Pueblos AS P INNER JOIN ConsultaPrimerIDPorProvincia AS CPID ON (P.Provincia = CPID.Provincia) AND (P.ID = CPID.PrimerID)

WHERE P.Provincia = [Introduzca la provincia];

Access le mostrará un cuadro de diálogo para que introduzcas el nombre de la provincia.

Manejo de nulos: Si stus campos ID o Pueblo pueden contener valores nulos y esto afecta tu orden, considera usar Nz (por ejemplo, Nz(ID, 0) o Nz(Pueblo, "zzzzzz")) para asegurarte de que los nulos se ordenen de una manera específica.

Rendimiento: Las subconsultas correlacionadas para el N-ésimo registro pueden ser lentas en grandes conjuntos de datos. Para bases de datos muy grandes, podrías considerar alternativas como la programación VBA para iterar o una base de datos SQL Server que tenga funciones de ventana (ROW_NUMBER()). Sin embargo, para la mayoría de los escenarios de Access, las soluciones presentadas son adecuadas.

Respuesta
1

Enviado mensaje, infinitamente más sencillo.

Respuesta
1

Obtener el primero -o un elemento- de cada subconjunto (subconjunto = provincia) y todos con la misma condición es fácil de lograr con VBA y su resultado puede ser llevado a una tabla temporal para cualquier uso del resultado.
Lo primero es adelgazar el conjunto de datos aplicándoles la condición (por ejemplo que el pueblo tenga un número NN de habitantes o lo que sea aplicable).
Esa SQL se ordena por provincia (para que sus pueblos estén consecutivos) y de ser necesario se ordena por cualquier otro elemento (por ejemplo su nombre).
Se crea una variable temporal para guardar la provincia y si se desease que en lugar del primero fuera el séptimo, otra para contar los registros de esa provincia
A la anterior SQL se la recorre con un bucle en el que se comparara la variable (en principio una cadena vacía) con la provincia actual del bucle.

De ser diferentes se actualiza la variable-provincia y se exporta el registro a la tabla temporal para uso posterior.
Si son iguales es que ya ha sido procesado un registro de esa provincia por lo que el bucle salta al siguiente y se repite hasta obtener la siguiente provincia sea diferente.
Si en lugar del primero de cada provincia se desea el cuarto, es donde entra la segunda variable (que se actualiza a cero en el cambio de provincia) y que se incrementa hasta llegar al número deseado, en cuanto se cumple la condición es el momento de hacer la exportación del registro a la tabla temporal.
Para generar las condiciones:
Se pueden crear con dos combos, en uno las condiciones y en el otro las opciones para esa condición (se pueden concatenas varias condiciones) lo que fácilmente puede reducir el número de provincias devueltas.
Si es factible esta opción y se necesita ampliar algún punto (yo ‘la veo’ pero no sé si la he expuesto con claridad) solo indicar las dudas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas