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)
- 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.
- 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.
- 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.
- 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.
- 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.
- 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:
- Ve a Crear > Asistente para informes (o Diseño de informe).
- Selecciona la consulta que acabas de crear como origen de datos para tu informe.
- 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.