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 YourTable
durch den Namen Ihrer Tabelle.
Hier q2
erhält die innerste Abfrage den größten Wert year
für jeden name
Wert, bei dem year
kleiner als das aktuelle Jahr ist year(date())
.
Das Ergebnis dieser Abfrage wird dann mit der Originaltabelle verknüpft, um aptdate
fü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.