2 Consulta SQL variable para datos de un año anterior

2 Consulta SQL variable para datos de un año anterior

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.AptDate
de 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 YourTablecon el nombre de su tabla.

Aquí, la consulta más interna q2obtiene el mayor yearpara cada uno namedonde yeares 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 aptdatepara 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.

información relacionada