Ich habe ein Tabelle mit ID (dient als identifizierung mit anderen Tabellen) und 4 Spalten A - D in denen entweder ein Datum drin steht oder auch leer ist.
Jetzt möchte ich eine Abfrage (für einen Bericht) bei dem als Ausgabe für jeden Datensatz das jeweils jüngste Datum und der Spaltenname ausgegeben wird.
also z.B.
Id Datum Modul
3 22.10.2017 Modul A
8 12.07.2017 Modul D
99 22.12.1994 Modul C
......
Die Ausgangslage ist ungünstig. :( Du kannst eine Vereinigungsabfrage erstellen, in der Du jedem Datumswert mitteilst, von welcher ursprünglichen Spalte in der der Tabelle (nenne ich im weiteren einfach T) er stammt.
SELECT id, a AS Datum, "Modul A" AS Modul FROM T WHERE a Is Not Null
UNION ALL
SELECT id, b, "Modul B" FROM T WHERE b Is Not Null
UNION ALL
SELECT id, c, "Modul C" FROM T WHERE c Is Not Null
UNION ALL
SELECT id, d, "Modul B" FROM T WHERE d Is Not Null;
Spaltennamen in Abfragetext ggf. an Deine Gegegebenheiten im Text anpassen und den Code in die SQL-Ansicht einer neuen Abfrage kopieren und testen. Das war Schritt 1.
Diese Abfrage muss erneut abgefragt werden, um das höchste Datum je id zu erheischen. Dazu das Summensymbol (Sigma) im Band oben anklicken und id als auch Datum als Feld in die Abfrage aufnehmen. Bei id sollte unter Funktion Gruppierung und bei Datum die Funktion Maximum stehen.
Schritt 3: Nimm Abfrage 1 und Abfrage 2 in eine neue Abfrage auf. Ziehe Verknüpfungslinien jeweils zwischen der id und zwischen dem Datum auf. Danach wählst Du alle Felder aus der 1. Abfrage aus und solltest das Wunschresultat vorliegen haben.
Bei größerem Datenbestand ist mit Wartezeiten bei der Ausführung zu rechnen. Sollte das der Fall sein, solltest Du bestrebt sein, die Ausgangstabelle so zu organisieren, wie es die Abfrage 1 ausgibt. Dabei könnte man noch statt dem Text im Feld Modul einen Fremdschlüssel von einer Tabelle mit zwei Feldern einsetzen, die die vier Module in vier Datensätzen beschreibt.
ist ja fast wie eine Doktorarbeit....
Hab soweit die Abfragen erstellt aber....
es wird zwei mal nach a b c d gefragt
geb ich da nichts ein...ist die Ausgabe ohne ergebniss
geb ich irgendwas ein(egal ob Zahl oder Datum) ....gibt es für jede ID nicht nur das jüngstes Modul sondern alle
bsp:
ID Datum Modul
7 10.10.2017 Modul A
7 14.12.2017 Modul B
66 01.01.2015 Modul A
66 05.12.2018 Modul D
schön wäre aber je ID eine Zeile mit dem Datum und dem jüngsten Modul
Die Tabelle heist tab_Einsatzhelfer
mit den Spalten
Modul_A, Modul_B.....Modul_C
und als Wert wird das Datum eingetragen
Hallo,
aus DbWiki.net und etwas modifiziert:
Public Function fktMaxDat(ParamArray P())
' Maximum
Dim V, I As Long, Spalte As Long
V = 0
For I = LBound(P) To UBound(P)
If (P(I) > V) Then
V = CDate(P(I))
Spalte = I + 1
End If
Next I
fktMaxDat = Format(V, "dd.mm.yyyy") & ", " & Choose(Spalte, "Modul A", "Modul B", "Modul C", "Modul D")
End Function
Aufruf:
Select * , fktMaxDat ([Modul_A],[Modul_B],[Modul_C],[Modul_D]) from tab_Einsatzhelfer
Bei dem Aufruf meckert er aber wegen dem *
Ich habe Dir ein Beispiel hier (http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=7d2f6c2b03d85c42fbda023695c8af60) eingestellt.
Hallo,
der Einwand von Lachtaube scheint mir untergegangen zu sein.
Zitat von: LachtaubeDie Ausgangslage ist ungünstig.
Mit einem normalisierten Aufbau der Tabelle wäre der ganze Aufwand gar nicht nötig.
Die Moduldatumswerte als je ein Datensatz mit einem Kennzeichen für das Modul in einer extra Tabelle würde die Aufgabe zu einem Kinderspiel machen.
Wollte ich nur noch erwähnt haben.
Hallo,
Zitatist ja fast wie eine Doktorarbeit....
Liegt wohl am angedeuteten suboptimalen Datenmodell.
Mit einer tab_Module und einer Zwischentabelle tab_Helfer_Module
erhält man aus den Beispieldaten mit dieser Abfrage
SELECT
Q.HelferID_F,
Q.ModDatum,
M.ModulName
FROM tab_Module AS M
INNER Join
(
SELECT
HM.HelferID_F,
HM.ModulID_F,
HM.Moddatum
FROM tab_Helfer_Module AS HM
INNER Join
(
SELECT HMU.HelferID_F,
Max(HMU.Moddatum) As ModulDatum
FROM tab_Helfer_Module AS HMU
GROUP BY HMU.HelferID_F
) AS M
ON (HM.Moddatum = M.ModulDatum) AND (HM.HelferID_F = M.HelferID_F)
) AS Q
ON M.ModulID = Q.ModulID_Fdas gewünschte Ergebnis
7 14.12.2017 Modul B
66 05.12.2018 Modul D
gruss ekkehard
Hallo,
bei der VBA-Lösung:
ZitatBei dem Aufruf meckert er aber wegen dem *
Das ist ein SQL-String, sprich Abfrage und kein VBA-Code....