2 Variable SQL-Abfrage für Daten aus einem Vorjahr

2 Variable SQL-Abfrage für Daten aus einem Vorjahr

Lassen Sie den Datensätzen bei ihrer Erstellung eine Tabelle mit IDs zuweisen.

Besitzen Sie Aufzeichnungen für mehrere Jahre (manchmal werden Jahre übersprungen, also beispielsweise: 2019, 2017, 2016 usw.).

Die Datensätze enthalten ein Jahresfeld als Text und ein Namensfeld als Text (dieses Namensfeld ist über alle Jahre hinweg identisch) sowie ein AptDate-Feld als Datum.

Mit einer Access SQL-Abfrage möchte ich anzeigen:

der Name, das aktuelle Jahr, das Wohnungsdatum des aktuellen Jahres, das Wohnungsdatum des „vorhergehenden“ Jahres (da der Name identisch ist und das Jahr das nächstjüngere Jahr ist)

Bin mit SQL so weit gekommen (zeigt das AptDate des „vorherigen“ Jahres für einen 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]))))))));

Ich möchte EnteredSampleName entfernen und dieses „vorherige“ AptDate für alle Datensätze anzeigen (einige „vorherige“ Jahre können Null sein, da für diesen Namen möglicherweise kein früherer Datensatz vorhanden ist).

Ich scheine diese Nuss nicht zu knacken - jede Hilfe ist herzlich willkommen.


Vielen Dank für Ihre hilfreichen Antworten – ich werde sie bald testen.

Um in der Zwischenzeit Lees Anfrage zu beantworten:

Die Beispieltabelle sieht wie folgt aus:

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

Ziel des Abfrageergebnisses:

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  

Es gibt wie erwartet kein AptDatePrevious für D – hoffe, das klärt die Sache auf – danke.

Antwort1

Die nummerierten Beispiele von dieser MS-Site weisen Ihnen möglicherweise die richtige Richtung:
https://support.office.com/en-us/article/Verschachteln einer Abfrage in einer anderen Abfrage oder in einem Ausdruck durch Verwenden einer Unterabfrage – a8532322-e42f-4f94-bc38-ace7c182916a

Sie müssen ungefähr Folgendes tun:

Wählen Sie Table.Name, Table.Year, Table.AptDate, expr(hier vorheriges Datum berechnen*)
aus der Tabellensortierung
nach {wie auch immer Sie möchten}

*Der Ausdruck würde ungefähr so ​​aussehen:

Wählen Sie max(PrevAptDate.AptDate)
aus der Tabelle als PrevAptDate,
wobei (PrevAptDate.AptDate < Table.AptDate)
und
(PrevAptDate.Name = Table.Name)

Das ist alles spontan, aber es sollte naheliegend sein und Sie in die richtige Richtung weisen. Ich hoffe, es hilft.

Antwort2

Vorausgesetzt, ich habe Ihr Setup und Ihre Anforderungen richtig verstanden, ist unten eine mögliche Methode mit Verknüpfungen anstelle von korrelierten Unterabfragen aufgeführt:

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())

Ersetzen Sie in der obigen Abfrage jedes Vorkommen YourTabledurch den Namen Ihrer Tabelle.

Hier q2erhält die innerste Abfrage den größten Wert yearfür jeden nameWert, bei dem yearkleiner als das aktuelle Jahr ist year(date()).

Das Ergebnis dieser Abfrage wird dann mit der Originaltabelle verknüpft, um aptdatefür jedes name& Maximum das Entsprechende auszuwählen year. Dies bildet die Unterabfrage q2.

Schließlich ist die ursprüngliche Tabellelinksmit der Unterabfrage verknüpft q2(falls für einen bestimmten Namen kein Datensatz aus dem vorherigen Jahr vorhanden ist) und die Ergebnisse werden von der übergeordneten Abfrage ausgegeben.

verwandte Informationen