Hallo,
ich bin neu hier und vielleicht könnt ihr mir helfen.
Es geht um folgendes:
Ich möchte eine Abfrage erschaffen in der mir die Datensätze mit dem jeweils höchsten Datum angezeigt werden.
Mal zum Aufbau der Tabelle(n):
Tabelle 1: tblGeräte_Basisdaten
-ID <-Autowert
-Prüfnummer <-Zahl
-Name <-Text
-Typ <-Text
Bsp. 1| 1| Verlängerungsleitung| weiß
Tabelle 2: tblGeräte_Messdaten
-ID <-Autowert
-Prüfnummer <-Zahl
-Prüfdatum <-Datum
-Messwert1 <-Zahl
-Messwert2 <-Zahl
-Messwert3 <-Zahl
bsp. 1| 1| 24.12.2016| 100mA| etc.
Jetzt soll folgendes Passieren, in die Tabelle Messdaten sollen alle Messwerte von allen Geräten über eine, sagen wir mal 5 Jahre, (jedes Jahr eine Messung).
Aber in dem Formular, würde ich gerne nur die mit dem neusten Datum anzeigen, später in einem Detailbericht dann ein Gerät mit den jeweiligen Datensätzen aus dem der Messwerttabelle.
So nun habe ich eine Abfrage erstellt die mir aus der Messwerttabelle den Datensatz mit dem höchsten Datum anzeigt aber eben wirklich nur diesen einen.
Wenn ich jetzt z.B. 5 Prüflinge habe, habe ich aber 5x ein höchstes Datum (was natürlich nicht immer gleich ist). Und ich möchte das mir diese 5 Datensätze angezeigt werden.
Bsp:
Prüfling 1 | 29.8.2014
Prüfling 2 | 27.9.2014
Prüfling 3 | 8.4.2015
etc.
Meine Abfrage sieht zur Zeit folgendermaßen aus:
SELECT tblGeräte_Basisdaten.Prüfnummer, tblGeräte_Messdaten.Prüfdatum, tblGeräte_Messdaten.Messwert1, tblGeräte_Messdaten.Messwert2, tblGeräte_Messdaten.Messwert3, tblGeräte_Basisdaten.Name, tblGeräte_Basisdaten.Typ
FROM tblGeräte_Basisdaten LEFT JOIN tblGeräte_Messdaten ON tblGeräte_Basisdaten.Prüfnummer = tblGeräte_Messdaten.Prüfnummer
GROUP BY tblGeräte_Basisdaten.Prüfnummer, tblGeräte_Messdaten.Prüfdatum, tblGeräte_Messdaten.Messwert1, tblGeräte_Messdaten.Messwert2, tblGeräte_Messdaten.Messwert3, tblGeräte_Basisdaten.Name, tblGeräte_Basisdaten.Typ
HAVING (((tblGeräte_Messdaten.Prüfdatum)=(SELECT Max([tblGeräte_Messdaten].[Prüfdatum]) FROM [tblGeräte_Messdaten])));
Ich hoffe ihr versteht was ich meine und vielleicht könnt ihr mir helfen.
Grüße
Balaezth
Hallo,
etwa so:
SELECT tblGeräte_Basisdaten.Prüfnummer, tblGeräte_Messdaten.Prüfdatum, tblGeräte_Messdaten.Messwert1, tblGeräte_Messdaten.Messwert2, tblGeräte_Messdaten.Messwert3, tblGeräte_Basisdaten.Name, tblGeräte_Basisdaten.Typ
FROM tblGeräte_Basisdaten LEFT JOIN tblGeräte_Messdaten ON tblGeräte_Basisdaten.Prüfnummer = tblGeräte_Messdaten.Prüfnummer
Where tblGeräte_Messdaten.Prüfdatum= (
SELECT Max(T.[Prüfdatum]) FROM [tblGeräte_Messdaten] as T
Where T.Prüfnummer = tblGeräte_Basisdaten.Prüfnummer
)
SELECT q.Prüfnummer,
q.Prüfdatum,
q.Messwert1,
q.Messwert2,
q.Messwert3,
b.Name,
b.Typ
FROM tblGeräte_Basisdaten AS b
LEFT JOIN ( SELECT m.Prüfnummer,
Max( m.Prüfdatum ) AS Prüfdatum,
First( m.Messwert1 ) AS Messwert1,
First( m.Messwert2 ) AS Messwert2,
First( m.Messwert3 ) AS Messwert3,
FROM tblGeräte_Messdaten AS m
GROUP BY d.Prüfnummer ) AS q
ON b.Prüfnummer = q.Prüfnummer;
PS: Die Messwert-Tabelle ist suboptimal organisiert und sollte aufgeteilt werden, so dass zu jedem Prüfdatum die Messdaten in Detaildatensätzen in einer separaten Tabelle stehen.
PPS: Auf Umlaute und andere Sonderzeichen sollte man in Objektnamen verzichten. Name ist auch ein schlecht gewählter Feldname, weil er mit der gleichnamigen Eigenschaft in Formularen und Berichten kollidiert.
Kernberechnung:
SELECT
Prüfnummer,
MAX(Prüfdatum) AS MaxDatum
FROM
tblGeräte_Messdaten
GROUP BY
Prüfnummer
Erweiterung, um alle Felder der Tabelle zu erhalten:
SELECT
M.*
FROM
(
SELECT
Prüfnummer,
MAX(Prüfdatum) AS MaxDatum
FROM
tblGeräte_Messdaten
GROUP BY
Prüfnummer
) AS K
INNER JOIN tblGeräte_Messdaten AS M
ON K.Prüfnummer = M.Prüfnummer
AND
K.MaxDatum = M.Prüfdatum
Diese Abfrage kannst Du nun statt der ursprünglichen Tabelle tblGeräte_Messdaten mit der Basistabelle verknüpfen.
Hallo,
vielen dank für die schnellen Antworten.
@DF6GL
Danke für deinen Vorschlag.
@Lachtaube
Ja du hast recht, ich schau das ich Namen von Tabellen und Spalten ordentlicher deklariere. Danke.
@ebs17
Vielen Dank, das ist wohl genau das was ich gesucht habe.
Grüße
Balaezth