Tener una tabla con ID asignados a los registros a medida que se crean.
Tener registros de varios años (a veces se omiten años, por lo que podrían tener: 2019, 2017, 2016, etc...).
Los registros incluyen un campo Año como texto y un campo Nombre como texto (este campo Nombre es idéntico a lo largo de los años) y un campo AptDate como Fecha.
Con una consulta SQL de Access le gustaría mostrar:
el Nombre, el Año actual, la AptDate del año actual, la AptDate del año 'anterior' (a través de que el Nombre es idéntico y el Año es el siguiente año más reciente)
He llegado hasta aquí con SQL (muestra la AptDate del año 'anterior' para un EnteredSampleName):
SELECT Table.AptDate
FROM Table
WHERE (((Table.Name)=[EnteredSampleName]) AND ((Year=(SELECT Max(Table.Year) AS LastYear
FROM Table
WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.Name)=[EnteredSampleName]))))))));
Me gustaría eliminar EnteredSampleName y mostrar esta AptDate "anterior" para todos los registros (algunos años "anteriores" pueden ser nulos ya que es posible que no haya ningún registro anterior para este nombre).
Parece que no puedo resolver este problema; cualquier ayuda se agradece mucho.
Gracias por sus útiles respuestas. Las probaré pronto.
Mientras tanto, para responder a la petición de Lee:
La tabla de muestra tiene el siguiente aspecto:
ID Name Year AptDate
1 A 2015 2015-02-02
2 B 2015 2015-03-05
3 C 2017 2017-04-04
4 B 2017 2017-06-09
5 C 2018 2018-07-03
6 A 2018 2018-09-10
7 A 2019 2019-01-08
8 D 2019 2019-01-09
Objetivo del resultado de la consulta:
Name Year AptDate AptDatePrevious
A 2019 2019-01-08 2018-09-10
B 2017 2017-06-09 2015-03-05
C 2018 2018-07-03 2017-04-04
D 2019 2019-01-09
No hay AptDatePrevious para D como se esperaba; espero que eso aclare, gracias.
Respuesta1
Los ejemplos numerados de este sitio de MS pueden indicarle la dirección correcta:
https://support.office.com/en-us/article/nest-a-query-inside-another-query-or-in-an-expression-by-using-a-subquery-a8532322-e42f-4f94- bc38-ace7c182916a
Lo que tendrás que hacer es algo como esto:
Seleccione Tabla.Nombre, Tabla.Año, Tabla.AptDate, expr(calcular fecha anterior aquí*)de
Orden de tabla por {como desee}
*La expresión se vería así:
Seleccione max(PrevAptDate.AptDatede la tabla como PrevAptDate
donde (PrevAptDate.AptDate < Table.AptDate)
y
(PrevAptDate.Name = Table.Name)
Todo esto es improvisado, pero debe estar cerca y orientarte en la dirección correcta. Espero que ayude.
Respuesta2
Suponiendo que he entendido correctamente su configuración y requisitos, a continuación se muestra un método posible que utiliza uniones en lugar de subconsultas correlacionadas:
select t0.name, t0.year, t0.aptdate, q2.aptdate
from YourTable t0 left join
(
select t1.name, t1.aptdate
from YourTable t1 inner join
(
select t2.name, max(t2.year) as lastyear
from YourTable t2
where t2.year < year(date())
group by t2.name
) q1 on
t1.name = q1.name and
t1.year = q1.lastyear
) q2 on
t0.name = q2.name
where t0.year = year(date())
En la consulta anterior, reemplace cada aparición de YourTable
con el nombre de su tabla.
Aquí, la consulta más interna q2
obtiene el mayor year
para cada uno name
donde year
es menor que el año actual year(date())
.
El resultado de esta consulta luego se une internamente con la tabla original para seleccionar el correspondiente aptdate
para cada name
& máximo year
. Esto forma la subconsulta q2
.
Finalmente, la tabla original esizquierdase une a la subconsulta q2
(en caso de que no haya un registro del año anterior para un nombre determinado) y los resultados los genera la consulta principal.